在Android中,您可以在FragmentTransaction中为Fragment设置标记。
为什么我需要为片段设置标签?
如果Fragment根据其标签更改了行为,这是一种好习惯吗?
答案 0 :(得分:32)
可用于避免在Fragment
方向更改时重新创建Activity
。
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.photos_image_pager);
MyFragment fragment;
if (savedInstanceState != null) {
fragment = (MyFragment) getFragmentManager()
.findFragmentByTag("my_fragment_tag");
} else {
fragment = new MyFragment();
fragment.setArguments(getIntent().getExtras());
getFragmentManager()
.beginTransaction()
.add(android.R.id.content, fragment, "my_fragment_tag")
.commit();
}
}
在方向更改时重新创建Activity
,并调用onCreate(...)
方法。如果Fragment
在Activity
被销毁之前创建并添加到带有标记的FragmentManager
,则现在可以通过相同标记从FragmentManager
检索它。< / p>
有关如何使用的更长时间的讨论,请参阅:
答案 1 :(得分:2)
为什么我需要为片段设置标签?
Fragment
有时可以将Activity
用作后台工作者。这样的片段没有UI,它也被称为非UI片段。 String tag
是识别此片段的唯一方法。要添加此片段,请使用不add(Fragment, String)
的{{1}}方法。例如:
View Id
然后,要获得对此片段的引用,
FragmentManager fm = getFragmentManager();
workFragment.setTargetFragment(this, 0);
fm.beginTransaction().add(workFragment, "work").commit();
现在使用workFragment = (WorkFragment)fm.findFragmentByTag("work");
引用,您可以在workFragment
或它的UI片段中访问此片段的所有方法。 Here's非UI片段的完整示例。
如果Fragment基于改变其行为,那么这是一种很好的做法 它的标签?
在某些情况下,我们必须使用标记从Activity
更改片段的行为。应该没问题,我看过一些使用这种做法的开源应用程序。基本上,您为片段提供字符串标记。这用于标记Activity
中的片段,以便我们以后可以轻松查找。并从FragmentManager
更改或访问它的行为。
例如:
用户从Activity
切换到SettingsActivity
,更改设置,按回按钮返回MainActivity。您可以在MainActivity#onResume()中检测设置更改,并根据新设置更新或更改当前片段的行为。
MainActivity