39

我使用添加了一个片段

transaction.add(R.id.content, fragment, null);

我需要从这个开始新的片段。但要做到这一点,我需要知道第一个片段的容器视图 ID(在我的例子中是 R.id.content)。我怎样才能得到这个?

我可以直接使用这个 id 但我想片段不应该知道关于父活动的这种细节。例如,在这种情况下,不可能在另一个活动中使用这个片段。

可能从另一个片段“开始”片段是一种不好的做法,所有片段处理逻辑都应该由活动本身处理?但是创建彼此开始的漂亮片段序列似乎非常有用(例如 detalView->moreDetailView->evenMoreDetailView)。

4

4 回答 4

83

您可以通过调用访问容器的 id

((ViewGroup)getView().getParent()).getId();
于 2011-10-05T20:58:41.583 回答
14

我不知道我是否完全理解您的问题,但您在 onCreateView 中获得了 Container。我想您可以将其存储在局部变量中。

public View onCreateView(LayoutInflater inflater, 
  ViewGroup container,
  Bundle savedInstanceState) {
  mContainer = container;
  ...
}
于 2011-08-03T12:01:40.173 回答
8

我认为有一种更标准的方式来访问视图而不是使用

((ViewGroup) getView().getParent()).getId()

我将假设您正在使用一个 MainActivity 来呈现一个列表片段,然后它可以在单击一个项目时呈现另一个列表片段,依此类推。我假设您已选择将 MainActivity 的主视图替换为您提供的列表片段的内容。

因为每个列表片段都托管在 MainActivity 中,所以您始终可以访问 MainActivity 的视图。

// Inside of onListItemClick...
FragmentManager fm = getFragmentManager();
Fragment fragment = new MyOtherListFragment();

FrameLayout contentView = (FrameLayout) getActivity().findViewById(R.id.content_view);

fm.beginTransaction()
        .replace(contentView.getId(), fragment)
        .addToBackStack(null)
        .commit();

上面的例子假设你有一个在 MainActivity 中设置的 XML 布局资源,调用 XML 资源 R.layout.activity_main,其中有一个 id 为 R.id.content_view 的 FrameLayout。这是我采取的方法。我在这里展示的示例是我在应用程序中实际编写的示例的更简单版本。

顺便说一句,我的 IntelliJ 版本(版本 1.0.1)警告我

((ViewGroup) getView().getParent)

可能会抛出 NullPointerException。

于 2015-04-14T05:17:11.650 回答
5

假设您mCurrentFragment在 Activity 类中有 Fragment 实例。您可以通过以下方式获取 Fragment 的容器视图

int id = mCurrentFragment.getView().getParent().getId();
ViewGroup vg = (ViewGroup) findViewById(id); // Fragment's container View
于 2014-01-07T20:39:38.933 回答