zoukankan      html  css  js  c++  java
  • Android TabHost设置setCurrentTab(index),当index!=0时,默认加载第一个tab问题解决方法。

    最近在用TabHost,默认希望显示第2个tab,发现总是加载第三个tab的同时加载第一个,解决方法如下:

     1、首先查看addTab(TabSpec tabSpec)源代码:

    /**
         * Add a tab.
         * @param tabSpec Specifies how to create the indicator and content.
         */
        public void addTab(TabSpec tabSpec) {
    
            if (tabSpec.mIndicatorStrategy == null) {
                throw new IllegalArgumentException("you must specify a way to create the tab indicator.");
            }
    
            if (tabSpec.mContentStrategy == null) {
                throw new IllegalArgumentException("you must specify a way to create the tab content");
            }
            View tabIndicator = tabSpec.mIndicatorStrategy.createIndicatorView();
            tabIndicator.setOnKeyListener(mTabKeyListener);
    
            // If this is a custom view, then do not draw the bottom strips for
            // the tab indicators.
            if (tabSpec.mIndicatorStrategy instanceof ViewIndicatorStrategy) {
                mTabWidget.setStripEnabled(false);
            }
            mTabWidget.addView(tabIndicator);
            mTabSpecs.add(tabSpec);
    
            if (mCurrentTab == -1) {
                setCurrentTab(0);
            }
        }
    

      

     发现当我们进行addTab操作时,默认执行了最后一步,设置了第一个tab,所以我们需要bamCurrentTab的值设置为不为-1的一个数,且大于0。

    2、再看setCurrentTab(int index)方法源码:

    public void setCurrentTab(int index) {
            if (index < 0 || index >= mTabSpecs.size()) {
                return;
            }
    
            if (index == mCurrentTab) {
                return;
            }
    
            // notify old tab content
            if (mCurrentTab != -1) {
                mTabSpecs.get(mCurrentTab).mContentStrategy.tabClosed();
            }
    
            mCurrentTab = index;
            final TabHost.TabSpec spec = mTabSpecs.get(index);
    
            // Call the tab widget's focusCurrentTab(), instead of just
            // selecting the tab.
            mTabWidget.focusCurrentTab(mCurrentTab);
    
            // tab content
            mCurrentView = spec.mContentStrategy.getContentView();
    
            if (mCurrentView.getParent() == null) {
                mTabContent.addView(mCurrentView, new ViewGroup.LayoutParams(
                                        ViewGroup.LayoutParams.MATCH_PARENT,
                                        ViewGroup.LayoutParams.MATCH_PARENT));
            }
    
            if (!mTabWidget.hasFocus()) {
                // if the tab widget didn't take focus (likely because we're in touch mode)
                // give the current tab content view a shot
                mCurrentView.requestFocus();
            }
    
            //mTabContent.requestFocus(View.FOCUS_FORWARD);
            invokeOnTabChangeListener();
        }
    

      

    当mCurrentTab不为-1的时候会执行mTabSpecs.get(mCurrentTab).mContentStrategy.tabClosed()操作,所以在我们执行setCurrentTab()方法之前,我们再把mCurrentTab的值恢复为-1,这样就不会执行关闭操作导致空指针异常。

    3、具体方法如下:

     //取消tabhost默认加载第一个tab。
            try
            {
                Field current = tabHost.getClass().getDeclaredField("mCurrentTab");
                current.setAccessible(true);
                current.setInt(tabHost, 0);
            }catch (Exception e){
                e.printStackTrace();
            }
    
            TabHost.TabSpec tSpecCoupon = tabHost.newTabSpec("sth");
            tSpecCoupon.setIndicator(tabIndicator1);
            tSpecCoupon.setContent(new DummyTabContent(getBaseContext()));
            tabHost.addTab(tSpecCoupon);
    
            //mCurrentTab恢复到-1状态
            try
            {
                Field current = tabHost.getClass().getDeclaredField("mCurrentTab");
                current.setAccessible(true);
                current.set(tabHost, -1);
            }catch (Exception e){
                e.printStackTrace();
            }
    

      

    到此,我们屏蔽了默认的setCurrentTab(0)操作,同时恢复为-1后,又执行了我们的setCurrentTab(1)操作。

  • 相关阅读:
    百度之星资格赛1001——找规律——大搬家
    HDU1025——LIS——Constructing Roads In JGShining's Kingdom
    DP(递归打印路径) UVA 662 Fast Food
    递推DP UVA 607 Scheduling Lectures
    递推DP UVA 590 Always on the run
    递推DP UVA 473 Raucous Rockers
    博弈 HDOJ 4371 Alice and Bob
    DFS(深度) hihoCoder挑战赛14 B 赛车
    Codeforces Round #318 [RussianCodeCup Thanks-Round] (Div. 2)
    DP(DAG) UVA 437 The Tower of Babylon
  • 原文地址:https://www.cnblogs.com/liuqxFuture/p/3343675.html
Copyright © 2011-2022 走看看