30

在 Android 中,您可以在 FragmentTransaction 中为 Fragment 设置标签。

为什么我需要为片段设置标签?

如果 Fragment 根据其标签更改其行为,这是一种好的做法吗?

4

2 回答 2

33

片段标签可用于避免重新创建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之前创建的,并且使用标签添加到 ,那么现在可以通过相同的标签从 中检索它。ActivityFragmentManagerFragmentManager

有关如何使用它的更长讨论,请参阅:

于 2012-11-22T10:27:09.263 回答
2

对于非 UI 片段:

为什么我需要为片段设置标签?

有时,Fragment可以将Activity. 这种片段没有UI,也称为非UI片段。这String tag是识别此片段的唯一方法。要添加此片段,请使用add(Fragment, String)不需要View Id. 例如:

FragmentManager fm = getFragmentManager();
workFragment.setTargetFragment(this, 0);
fm.beginTransaction().add(workFragment, "work").commit();

然后稍后,要获得对这个片段使用的引用,

workFragment = (WorkFragment)fm.findFragmentByTag("work");

现在使用workFragment引用,您可以在Activity它的 UI 片段中访问此片段的所有方法。是非 UI 片段的完整示例。


对于带有 UI 的片段:

如果 Fragment 根据其标签更改其行为,这是一种好的做法吗?

在某些情况下,我们必须通过Activity使用标签来改变片段的行为。这样做应该没问题,我见过一些开源应用程序使用这种做法。基本上,您为片段提供字符串标签。这用于标记 中的片段,FragmentManager以便我们稍后可以轻松查找它。并从Activity.

例如:用户切换到SettingsActivityfrom MainActivity,更改设置,按下返回按钮返回到 MainActivity。您可以检测 MainActivity#onResume() 中的设置更改,并根据新设置更新或更改当前片段的行为。

FragmentManager fm = getFragmentManager();
uiFragment = (UiFragment) fm.findFragmentByTag("ui");
uiFragment.fetchNewData();
uiFragment.displayNewData();
于 2016-04-15T20:29:27.797 回答