web-dev-qa-db-fra.com

Android TabWidget détecte le clic sur l'onglet actuel

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?

35
0m4r

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!

20
0m4r

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

  }
});
50
Chirag_CID

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

24
SteveBorkman

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);
                }
            } 
        });
14
Lyubomir Todorov

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

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

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


        }
    });
1
Hasan Masud

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
        }
    }
});
0
Ms. Sonia

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"
0
ODAXY