博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
如何获取FragmentTabHost中指定标签页的Fragment
阅读量:6438 次
发布时间:2019-06-23

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

使用FragmentTabHost构建了包含几个标签页的界面,如何获取指定标签页的Fragment?

How to get Fragment in FragmentTabHost?

TabHost中Fragment的Tag

一般通过FragmentTabHost.addTab(TabSpec tabSpec, Class<?> clss, Bundle args)方法添加fragment:

TabSpec tabSpec = mTabHost.newTabSpec("TAB_TAG_" + i).setIndicator("TAB_TITLE_" + i); mTabHost.addTab(tabSpec, MyFragment.class, null);

而方法TabHost.TabSpec newTabSpec(String tag)的参数tag就是fragment的tag.

那么,我们有2种方法获取fragment。

通过Fragment.getTag()获取Fragment

最开始采用了这种办法,首先获取fragment manager管理的fragment列表,然后根据tag从列表中查找fragment:

private Fragment getFragment(int tabId){    List
fragments = getSupportFragmentManager().getFragments(); for(Fragment fragment : fragments) { String str1 = fragment.getTag(); String str2 = String.valueOf("TAB_TAG_" + tabId); if(str1 != null && str1.equals(str2)) // 最开始没有检查str1是否为空,导致crash! return fragment; } return null;}

然后掉进坑里了!

因为拿到的fragment列表,不仅仅是TabHost包含的fragment,还包含向attached activity添加的其它fragment,而如果这些fragment并未设置tag,那么fragment.getTag()将返回null,然后就crash了

通过FragmentManager.findFragmentByTag(String tag)获取Fragment

感觉这个方法最简洁。

private Fragment getFragment(int tabId){    return getSupportFragmentManager().findFragmentByTag("TAB_TAG_" + tabId);}

onTabChanged()中获取的fragment有时为空

打印了一些log发现,

  • 如果第1次切换到某个标签页,在onTabChanged()方法中立刻调用findFragmentByTag()时,返回的总是null,但如果延迟一段时间,就一定可以获取fragment.

  • 如果再次切换到某个标签页,在onTabChanged()中不需要延时,总可以返回fragment.

@Overridepublic void onTabChanged(final String tabId){    Fragment fg = getSupportFragmentManager().findFragmentByTag(tabId);    Log.d(TAG, "onTabChanged(): " + tabId + ", fragment " + fg);    if (fg == null) {        new Handler().postDelayed(new Runnable() {            @Override            public void run() {                Fragment fg = getSupportFragmentManager().findFragmentByTag(tabId);                Log.d(TAG, "onTabChanged() delay 50ms: " + tabId + ", fragment " + fg);            }        }, 50);    }}

LogCat输出:

// cannot get the selected fragment immediately if the fragment has never been instantiated.onTabChanged(): 1, fragment nullonTabChanged() delay 50ms: 1, fragment HistoryFragment{6f7a9d5 #2 id=0x7f09006e 1}onTabChanged(): 2, fragment nullonTabChanged() delay 50ms: 2, fragment HistoryFragment{10c59e72 #3 id=0x7f09006e 2}// can get the selected fragment immediately if the fragment already instantiated.onTabChanged(): 1, fragment HistoryFragment{6f7a9d5 #2 id=0x7f09006e 1}onTabChanged(): 2, fragment HistoryFragment{10c59e72 #3 id=0x7f09006e 2}


版权声明:《如何获取FragmentTabHost中指定标签页的Fragment?》由 WeiYi.Li 在 2015年10月12日写作。著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。

文章链接:

你可能感兴趣的文章
linux下root密码修改方法
查看>>
添加操作。。。
查看>>
Bootstrap框架
查看>>
MSHTML
查看>>
Android学习记录:SQLite数据库、res中raw的文件调用
查看>>
The 'microsoft.jet.oledb.4.0' provider is not registered on the local machin
查看>>
验证视图状态MAC失败的解决办法
查看>>
拦截器,过滤器,监听器原理
查看>>
P1312 Mayan游戏 [模拟][搜索]
查看>>
洛谷P4319 变化的道路
查看>>
LOJ#2353 货币兑换
查看>>
使用装饰器时带括号与不带括号的区别
查看>>
Linux终端乱码的解决办法
查看>>
解决问题Can’t connect to local MySQL server through socket
查看>>
图像像素灰度内插(Matlab实现)
查看>>
2017面试题1
查看>>
css 宽高自适应的div 元素 如何居中 垂直居中
查看>>
[转载]基于MVC4+EasyUI的Web开发框架经验总结(8)--实现Office文档的预览
查看>>
Python基础4_列表,元祖
查看>>
ASP.NET MVC区域
查看>>