获取片段的容器视图ID

Dmi*_*nko 33 containers android android-fragments android-view

我添加了一个片段

transaction.add(R.id.content, fragment, null);
Run Code Online (Sandbox Code Playgroud)

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

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

可能是从另一个"起始"片段是一个不好的做法,所有片段处理逻辑应该由活动本身处理?但是创建好的片段序列相互启动似乎非常有用(例如detalView-> moreDetailView-> evenMoreDetailView).

Beh*_*çar 77

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

((ViewGroup)getView().getParent()).getId();
Run Code Online (Sandbox Code Playgroud)

  • 它给我null任何想法,我有主屏幕包含布局,当我试图说LinearLayout x =(LinearLayout)((ViewGroup)getView().getParent()); 在Fragment类中调用但它始终为null (3认同)

Spa*_*rky 12

Dunno,如果我完全理解你的问题,但你在onCreateView中得到了Container.我想你可以把它存放在一个局部变量中.

public View onCreateView(LayoutInflater inflater, 
  ViewGroup container,
  Bundle savedInstanceState) {
  mContainer = container;
  ...
}
Run Code Online (Sandbox Code Playgroud)

  • 我看不出此方法有什么问题。如果您不想存储视图,则只需存储ID。 (2认同)

Mie*_*yba 8

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

((ViewGroup) getView().getParent()).getId()
Run Code Online (Sandbox Code Playgroud)

我将假设你正在使用一个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();
Run Code Online (Sandbox Code Playgroud)

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

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

((ViewGroup) getView().getParent)
Run Code Online (Sandbox Code Playgroud)

可能会抛出NullPointerException.

  • 好吧,在提出这个问题几周后,我了解到 Fragments 设计在可用性方面存在缺陷,并且再也没有使用过 Fragments。 (2认同)

mac*_*Jun 5

假设您mCurrentFragment在Activity类中有Fragment实例.您可以通过获取Fragment的容器View

int id = mCurrentFragment.getView().getParent().getId();
ViewGroup vg = (ViewGroup) findViewById(id); // Fragment's container View
Run Code Online (Sandbox Code Playgroud)

  • (如果我正确理解您在做什么)您从 ** 获得 id 的对象是您正在寻找的对象。这两行可以用较短的行替换:`ViewGroup vg = (ViewGroup) mCurrentFragment.getView().getParent();` 任何情况下这与您所做的不同? (2认同)