片段标签的用途

2022-09-01 10:54:00

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

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

如果片段根据其标记更改其行为,这是好的做法吗?


答案 1

片段标签可用于避免重新创建方向更改。FragmentActivity

@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(); 
    }
}

在方向更改时重新创建 ,并调用其方法。如果 是在 销毁 之前创建的,并且已添加到 带有标记,则现在可以从 同一标记中检索它。ActivityonCreate(...)FragmentActivityFragmentManagerFragmentManager

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


答案 2

对于非 UI 片段:

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

有时 ,可将 用作 后台工作线程。这样的片段没有 UI,它也被称为非 UI 片段。这是识别此片段的唯一方法。要添加此片段,请使用不采用 的方法。例如:FragmentActivityString tagadd(Fragment, String)View Id

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

然后稍后,为了获得对此片段的引用使用,

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

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


对于具有 UI 的片段:

如果一个片段根据其标签改变其行为,这是好的做法吗?

在某些情况下,我们必须将片段的行为从使用标签中改变出来。这样做应该没问题,我已经看到一些开源应用程序使用这种做法。基本上,您为片段提供字符串标签。这用于标记 中的片段,以便我们以后可以轻松查找它。并从 中更改或访问它的行为。ActivityFragmentManagerActivity

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

FragmentManager fm = getFragmentManager();
uiFragment = (UiFragment) fm.findFragmentByTag("ui");
uiFragment.fetchNewData();
uiFragment.displayNewData();

推荐