博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
取消TabHost默认加载第一页的方法
阅读量:6319 次
发布时间:2019-06-22

本文共 3554 字,大约阅读时间需要 11 分钟。

hot3.png

虽然TabHost已经过时了,不过在我们项目中还是使用了它,于是发现一个问题,经常刷新第一页失败,失败原因是加载数据在定位成功之前发生,因此服务器无法返回数据,有这个疑问,于是问Google,找到如下答案:

最近在用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)操作。

转载于:https://my.oschina.net/reborn87/blog/604121

你可能感兴趣的文章
Unity3D Input按键系统
查看>>
简单的一条SQL,不简单的做事思维 NOT IN 、NOT EXISTS、LEFT JOIN用法差别 ...
查看>>
DataWorks:任务未运行自助排查
查看>>
ionic/cordova热部署
查看>>
「镁客早报」特斯拉裁员,马斯克解释没有办法;微软推出Azure DevOps赏金计划...
查看>>
centos 7.4 使用 pgxc_ctl 安装与使用
查看>>
Redis 单key值过大 优化方式
查看>>
【数据库】表分区
查看>>
nutz-sqltpl 1.3.4.RELEASE 发布,在 Nutz 项目中“解决 Java 拼接 SQL”问题
查看>>
城市 | 800个地铁站数据透析的京沪白领图鉴:隐形土豪、无产中产阶级和猪猪女孩...
查看>>
前端脚本!网站图片素材中文转英文
查看>>
linux的常用易忘命令
查看>>
PHP 分割字符串
查看>>
java 基于QRCode、zxing 的二维码生成与解析
查看>>
img垂直水平居中与div
查看>>
防恶意注册的思考
查看>>
C# 命名空间
查看>>
订餐系统之同步美团商家订单
查看>>
使用ArrayList时设置初始容量的重要性
查看>>
Java Web-----JSP与Servlet(一)
查看>>