Android TabWidget detect click on current tab

前端 未结 9 1980
庸人自扰
庸人自扰 2020-11-28 05:34

I am trying to find way to be able to fire an onclick event on a tab when this tab is the current tab.

I did try this way (among several other) with no success thou

相关标签:
9条回答
  • 2020-11-28 06:33

    I think I have found a solution, here follows a sample 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;
                }
            });
        }       
    

    Probably it is possible to improve it, but this does the work for me!

    0 讨论(0)
  • 2020-11-28 06:34
    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"));
                }
    
    
            }
        });
    
    0 讨论(0)
  • 2020-11-28 06:35

    After a lot of thinking about this, the solution ended up being easier than I thought. What I did was just create a new child class that extends TabHost and override the setCurrentTab method like so:

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

    To use your new class instead of the typical TabHost just edit your layout xml file with:

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

    Hope this helps...

    0 讨论(0)
提交回复
热议问题