android fragmenttabhost怎么用

android fragmenttabhost怎么用,第1张

布局 中添加:

<android.support.v4.app.FragmentTabHost

android:id="@+id/prize_tabhost"

android:layout_width="match_parent"

android:layout_height="match_parent" >

</android.support.v4.app.FragmentTabHost>

再在fragment中

@Override

public View onCreateView(LayoutInflater inflater, ViewGroup container,

Bundle savedInstanceState) {

View view = inflater.inflate(R.layout.frg_prize, container, false)

mTabHost = (FragmentTabHost) view.findViewById(R.id.prize_tabhost)

mTabHost.setup(getActivity(), getChildFragmentManager(), R.id.prize_title)

mTabHost.addTab(mTabHost.newTabSpec(“tag”).setIndicator(“NAME”),

fragment, null)

mTabHost.addTab(mTabHost.newTabSpec(“tag1”).setIndicator(“NAME1”),

fragment, null)

使用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.

@Override

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

onTabChanged() delay 50ms: 1, fragment HistoryFragment{6f7a9d5 #2 id=0x7f09006e 1}

onTabChanged(): 2, fragment null

onTabChanged() 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}

贴个代码你:private Fargment f

在onCreat()中:

final Handler hand = new Handler() {

@Override

public void handleMessage(Message msg) {

super.handleMessage(msg)

f = getSupportFragmentManager().findFragmentByTag("TAG1")//TAG1是-->newTabSpec("TAG1")

Log.e("aaaa", "=====获得的view1是:=====" + f)

}

}

new Thread() {

@Override

public void run() {

try {

Thread.sleep(1500)//休眠1.5s后就能获取到了

} catch (InterruptedException e) {

// TODO Auto-generated catch block

e.printStackTrace()

}

Message msg = hand.obtainMessage()

hand.sendMessage(msg)

}

}.start()


欢迎分享,转载请注明来源:内存溢出

原文地址: https://outofmemory.cn/bake/11183910.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-05-14
下一篇 2023-05-14

发表评论

登录后才能评论

评论列表(0条)

保存