J'essaie de trouver un moyen de déclencher un événement onclick sur un onglet lorsque cet onglet est l'onglet actuel.
J'ai essayé de cette façon (parmi plusieurs autres) sans succès.
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();
}
}
}
le fait est que je mets onClickListener
à null
donc, la prochaine fois que je clique sur un onglet, rien ne se passe, mais j'aimerais avoir le comportement de l'onglet normal .
Une idée là dehors?
Je pense avoir trouvé une solution, voici un exemple de code:
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;
}
});
}
Il est probablement possible de l'améliorer, mais cela fait le travail pour moi!
Après avoir utilisé de nombreuses solutions pour écouter les onglets, j'ai trouvé une solution très 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");
}
}
});
Après beaucoup de réflexion à ce sujet, la solution a fini par être plus facile que je ne le pensais. J'ai simplement créé une nouvelle classe enfant qui étend TabHost et remplace la méthode setCurrentTab comme suit:
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);
}
}
}
Pour utiliser votre nouvelle classe au lieu du TabHost typique, modifiez simplement votre fichier xml de mise en page avec:
<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>
J'espère que cela t'aides...
Correction laide: DANS la mise onClickListener: tabHost.SetCurrentTab(OtherTab); tabHost.SetCurrentTab(CurrentTab);
Où pour l'index d'un autre onglet, j'utilise ma vue la plus simple sous les onglets.
P.S. Les clients veulent toujours que leurs applications soient différentes :)
Voici le code que j'utilise (je n'ai que 2 onglets Tab1 et 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);
}
}
});
Le problème ici est que setOnTabChangedListener
ne se déclenche pas lorsque vous cliquez sur l'onglet sélectionné et si vous définissez un OnClickListener
sur l'onglet, vous perdez le comportement normal de l'onglet.
Ainsi, une solution simple consiste à mettre OnClickListener
sur l'onglet, et à l'intérieur, définissez par programme qu'il s'agit de l'onglet actuel.
Avec TabHost
:
getTabWidget().getChildAt(0).setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
// custom code
tabHost.setCurrentTab(0);
}
});
Avec TabLayout
tabLayout.getTabAt(0)setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
// custom code
TabLayout.Tab tab = tabLayout.getTabAt(0);
tab.select();
}
}
});
Si vous voulez essayer Android.support.design.widget.TabLayout, vous pouvez le faire comme ceci:
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"));
}
}
});
Cela fonctionne pour moi...
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 vous avez une disposition d'onglet personnalisée, vous devrez peut-être l'ajouter dans votre vue personnalisée, cela a résolu mon problème:
Android:duplicateParentState="true"