我使用
添加了一个片段transaction.add(R.id.content, fragment, null);
我需要从这个开始新片段。但要做到这一点,我需要知道第一个片段的容器视图ID(在我的例子中是R.id.content)。我怎么能得到这个?
我可以直接使用这个id,但我想片段不应该知道关于父活动的这类细节。例如,在这种情况下,不可能在另一个活动中使用此片段。
可能是另一个“启动”片段是一个不好的做法,所有片段处理逻辑应该由活动本身处理?但是创建好的片段序列相互启动似乎非常有用(例如detalView-> moreDetailView-> evenMoreDetailView)。
答案 0 :(得分:76)
您可以通过调用
来访问容器的ID((ViewGroup)getView().getParent()).getId();
答案 1 :(得分:12)
Dunno如果我完全理解你的问题,但你在onCreateView中获得了Container。我想你可以把它存放在一个局部变量中。
public View onCreateView(LayoutInflater inflater,
ViewGroup container,
Bundle savedInstanceState) {
mContainer = container;
...
}
答案 2 :(得分: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。
答案 3 :(得分:5)
假设您在Activity类中有Fragment实例mCurrentFragment
。
您可以通过
int id = mCurrentFragment.getView().getParent().getId();
ViewGroup vg = (ViewGroup) findViewById(id); // Fragment's container View