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 в том, что я установил onClickListener null поэтому в следующий раз, когда я нажимаю на вкладку, ничего не происходит, но я бы хотел иметь нормальное поведение вкладки.

Любая идея там снаружи?

После множества решений для прослушивателя вкладок я нашел очень простое решение …

 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"); } } }); 

После долгих размышлений об этом решение оказалось проще, чем я думал. Я только что создал новый дочерний class, который расширяет 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); } } } 

Чтобы использовать ваш новый class вместо типичного TabHost, просто отредактируйте XML-файл макета с помощью:

         

Надеюсь это поможет…

Я думаю, что нашел решение, здесь следует пример кода:

  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 

Возможно, это можно улучшить, но для меня это работает!

Уродливое исправление: IN onClickListener put: tabHost.SetCurrentTab(OtherTab); tabHost.SetCurrentTab(CurrentTab); tabHost.SetCurrentTab(OtherTab); tabHost.SetCurrentTab(CurrentTab); Где для индекса другой вкладки я использую мой самый простой вид под вкладками.

Пользователи PS всегда хотят, чтобы их приложения были разными 🙂

Это код, который я использую (у меня есть только две вкладки 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")); } } }); 

Если у вас есть настраиваемый макет вкладки, возможно, вам нужно добавить это в свой пользовательский вид, он решил мою проблему:

 android:duplicateParentState="true" 

Это работает для меня …

 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 } } }); 
Interesting Posts
Давайте будем гением компьютера.