Android TabWidget обнаруживает нажатие на текущую вкладку
Я пытаюсь найти способ вызвать событие onclick на вкладке, когда эта вкладка является текущей вкладкой.
Я попробовал этот путь (среди нескольких других) безуспешно, ты.
public void onTabChanged(String tabId) {
Log.d(this.getClass().getName(), ">>>>>>>>>>>>>>>>>>>>>>>> tabId: " + tabId);
int tabs = getTabWidget().getChildCount();
Log.d(this.getClass().getName(), "tabs: " + tabs);
for(int i=0; i<tabs; i++){
View tab = getTabWidget().getChildAt(i);
if(i==tabHost.getCurrentTab()){
Log.d(this.getClass().getName(), "tab: " + i);
tab.setOnClickListener(this);
}else{
tab.setOnClickListener(null);
tab.getOnFocusChangeListener();
}
}
}
дело в том, что я установил onClickListener
в null
Итак, в следующий раз, когда я нажимаю на вкладку, ничего не происходит, но я хотел бы иметь нормальное поведение вкладки.
Есть идеи снаружи?
9 ответов
Я думаю, что нашел решение, ниже приведен пример кода:
intent = new Intent(this, HomeGroup.class);
View tab1 = _inflater.inflate(R.layout.custom_tab_1,null);
homeTab.setTag("Tab1");
spec = tabHost.newTabSpec("Tab1").setIndicator(tab1).setContent(intent);
tabHost.addTab(spec);
View tab2 = _inflater.inflate(R.layout.custom_tab_2,null);
homeTab.setTag("Tab2");
spec = tabHost.newTabSpec("Tab2").setIndicator(tab2).setContent(intent);
tabHost.addTab(spec);
View tab3 = _inflater.inflate(R.layout.custom_tab_3,null);
homeTab.setTag("Tab3");
spec = tabHost.newTabSpec("Tab3").setIndicator(tab3).setContent(intent);
tabHost.addTab(spec);
tabHost.setOnTabChangedListener(this);
//click on seleccted tab
int numberOfTabs = tabHost.getTabWidget().getChildCount();
for(int t=0; t<numberOfTabs; t++){
tabHost.getTabWidget().getChildAt(t).setOnTouchListener(new View.OnTouchListener() {
@Override
public boolean onTouch(View v, MotionEvent event) {
if(event.getAction()==MotionEvent.ACTION_UP){
String currentSelectedTag = MainTab.this.getTabHost().getCurrentTabTag();
String currentTag = (String)v.getTag();
Log.d(this.getClass().getSimpleName(), "currentSelectedTag: " + currentSelectedTag + " currentTag: " + currentTag);
if(currentSelectedTag.equalsIgnoreCase(currentTag)){
MainTab.this.getTabHost().setCurrentTabByTag(currentTag);
String newSelectedTabTag = MainTab.this.getTabHost().getCurrentTabTag();
if(newSelectedTabTag.toLowerCase().indexOf("tab1")!=-1){
//do smthg
}else if(newSelectedTabTag.toLowerCase().indexOf("tab1")!=-1){
//do smthg
}else if(newSelectedTabTag.toLowerCase().indexOf("tab3")!=-1){
//do smthg
}
return true;
}
}
return false;
}
});
}
Возможно, это можно улучшить, но это делает работу для меня!
Пройдя множество решений для слушателя табуляции, я нашел очень простое решение...
getTabHost().setOnTabChangedListener(new OnTabChangeListener() {
@Override
public void onTabChanged(String tabId) {
int i = getTabHost().getCurrentTab();
Log.i("@@@@@@@@ ANN CLICK TAB NUMBER", "------" + i);
if (i == 0) {
Log.i("@@@@@@@@@@ Inside onClick tab 0", "onClick tab");
}
else if (i ==1) {
Log.i("@@@@@@@@@@ Inside onClick tab 1", "onClick tab");
}
}
});
После долгих размышлений об этом решение оказалось проще, чем я думал. Я просто создал новый дочерний класс, который расширяет TabHost и переопределяет метод setCurrentTab следующим образом:
package com.mycompany.Views;
import android.content.Context;
import android.util.AttributeSet;
import android.widget.TabHost;
import android.widget.Toast;
public class ReclickableTabHost extends TabHost {
public ReclickableTabHost(Context context) {
super(context);
}
public ReclickableTabHost(Context context, AttributeSet attrs) {
super(context, attrs);
}
@Override
public void setCurrentTab(int index) {
if (index == getCurrentTab()) {
// FIRE OFF NEW LISTENER
} else {
super.setCurrentTab(index);
}
}
}
Чтобы использовать новый класс вместо обычного TabHost, просто отредактируйте XML-файл макета с помощью:
<FrameLayout
android:layout_height="match_parent"
android:layout_width="0dip"
android:layout_weight=".8">
<com.myCompany.Views.ReclickableTabHost
android:id="@android:id/tabhost"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:visibility="gone">
<LinearLayout
android:orientation="vertical"
android:layout_width="fill_parent"
android:layout_height="fill_parent">
<TabWidget
android:id="@android:id/tabs"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:background="@drawable/tab_unselected_holo"/>
<FrameLayout
android:id="@android:id/tabcontent"
android:layout_width="fill_parent"
android:layout_height="fill_parent">
</FrameLayout>
</LinearLayout>
</com.myCompany.Views.ReclickableTabHost>
Надеюсь это поможет...
Некрасивое исправление: в onClickListener положите:tabHost.SetCurrentTab(OtherTab);
tabHost.SetCurrentTab(CurrentTab);
Где для индекса Other Tab я использую мой самый простой вид под вкладками.
PS Клиенты всегда хотят, чтобы их приложения отличались:)
Это код, который я использую (у меня есть только 2 вкладки Tab1 и Tab2):
getTabWidget().getChildAt(1).setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
Log.d(TAG,"1"+getTabHost().getCurrentTabTag());
if (getTabHost().getCurrentTabTag().equals("Tab2")) {
Log.d(TAG,"2");
tabHost.setCurrentTab(0);
tabHost.setCurrentTab(1);
} else {
tabHost.setCurrentTab(1);
}
}
});
Проблема здесь в том, что setOnTabChangedListener
не срабатывает при нажатии на выбранную вкладку и при установке OnClickListener
на вкладке вы теряете нормальное поведение вкладки.
Таким образом, простое решение состоит в том, чтобы поставить OnClickListener
на вкладке и внутри нее установите программно, что это текущая вкладка.
С TabHost
:
getTabWidget().getChildAt(0).setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
// custom code
tabHost.setCurrentTab(0);
}
});
С TabLayout
tabLayout.getTabAt(0)setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
// custom code
TabLayout.Tab tab = tabLayout.getTabAt(0);
tab.select();
}
}
});
Если вы хотите попробовать android.support.design.widget.TabLayout, вы можете добиться этого следующим образом:
tabLayout.addOnTabSelectedListener(new TabLayout.OnTabSelectedListener() {
@Override public void onTabSelected(Tab tab) {
}
@Override public void onTabUnselected(Tab tab) {
}
@Override public void onTabReselected(Tab tab) {
}
});
mTabHost.setOnTabChangedListener(new OnTabChangeListener() {
@Override
public void onTabChanged(String tabId) {
int i = mTabHost.getCurrentTab();
mTabHost.getTabWidget().getChildAt(i)
.setBackgroundColor(Color.parseColor("#014a68"));
//int m = mTabHost.getChildCount();
for (int j = 0; j <=3; j++) {
if (j != i)
mTabHost.getTabWidget()
.getChildAt(j)
.setBackgroundColor(Color.parseColor("#000000"));
}
}
});
Это работает для меня...
TabHost host = (TabHost)findViewById(R.id.tabHost);
host.setOnTabChangedListener(new OnTabChangeListener() {
@Override
public void onTabChanged(String tabId) {
int i = host.getCurrentTab();
if (i == 0) {
// your method 1
}
else if (i ==1) {
// your method 2
}
}
});
Если у вас есть пользовательский макет вкладки, вам может потребоваться добавить это в свой пользовательский вид, это решило мою проблему:
android:duplicateParentState="true"