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)操作。

  • 相关阅读:
    set.end()和lower_bound使用记录
    自学图论的码队弟弟(dfs)
    打字训练
    (回归2.0)A
    斐波那契串 新疆省赛
    异或的路径 新疆省赛 (按位亦或)
    E. Product Oriented Recurrence (矩阵快速幂新模板)
    C. Beautiful Lyrics (模拟)构造
    O(n!)新疆省赛 d (贪心)
    Babelfish 分类: 哈希 2015-08-04 09:25 2人阅读 评论(0) 收藏
  • 原文地址:https://www.cnblogs.com/liuqxFuture/p/3343675.html
Copyright © 2011-2022 走看看