usar una tutorial tablayout tabhost tab studio que pestañas pestaña menú item example con como activity android listener android-tabhost tabwidget

una - tabs android studio



Android TabWidget detectar haga clic en la pestaña actual (9)

Estoy intentando encontrar la manera de poder activar un evento onclick en una pestaña cuando esta pestaña es la pestaña actual.

Lo intenté de esta manera (entre varias otras) sin éxito.

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

el punto es que configuro onClickListener como null , así que la próxima vez que haga clic en una pestaña, no pasa nada, pero me gustaría tener el comportamiento normal de las pestañas.

Alguna idea afuera?


Creo que he encontrado una solución, aquí sigue un código de muestra:

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

Probablemente es posible mejorarlo, ¡pero esto hace el trabajo por mí!


Después de muchas soluciones para el oyente de pestañas, encontré una solución muy simple ...

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


Después de pensar mucho sobre esto, la solución terminó siendo más fácil de lo que pensaba. Lo que hice fue crear una nueva clase para niños que amplíe TabHost y anule el método setCurrentTab así:

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

Para usar su nueva clase en lugar del típico TabHost, solo edite su archivo xml de diseño con:

<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>

Espero que esto ayude...


El problema aquí es que setOnTabChangedListener no se setOnTabChangedListener al hacer clic en la pestaña seleccionada, y si configura OnClickListener en la pestaña, pierde el comportamiento normal de la pestaña.

Entonces, una solución fácil es poner OnClickListener en la pestaña, y dentro de ella, establecer programáticamente que esta es la pestaña actual.

Con TabHost :

getTabWidget().getChildAt(0).setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { // custom code tabHost.setCurrentTab(0); } });

Con TabLayout

tabLayout.getTabAt(0)setOnClickListener(new View.OnClickListener() { @Override public void onClick(View view) { // custom code TabLayout.Tab tab = tabLayout.getTabAt(0); tab.select(); } } });


Esto es trabajo para mí...

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


Si quieres probar android.support.design.widget.TabLayout , puedes lograrlo así:

tabLayout.addOnTabSelectedListener(new TabLayout.OnTabSelectedListener() { @Override public void onTabSelected(Tab tab) { } @Override public void onTabUnselected(Tab tab) { } @Override public void onTabReselected(Tab tab) { } });


Si tiene un diseño de pestaña personalizado, puede necesitar agregar esto en su vista personalizada, resolvió mi problema:

android:duplicateParentState="true"


Ugly fix: EN el onClickListener put: tabHost.SetCurrentTab(OtherTab); tabHost.SetCurrentTab(CurrentTab); tabHost.SetCurrentTab(OtherTab); tabHost.SetCurrentTab(CurrentTab); Donde para el índice de la Otra Pestaña utilizo mi vista más simple debajo de las pestañas.

Los clientes de PS siempre quieren que sus aplicaciones sean diferentes :)

Este es el código que uso (tengo solo 2 pestañas Tab1 y 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); } } });


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