android-fragments 获取片段的容器视图ID

x8diyxa7  于 2022-11-14  发布在  Android
关注(0)|答案(5)|浏览(162)

我添加了一个片段

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

我需要从这个片段开始一个新的片段。但是要做到这一点,我需要知道第一个片段的容器视图id(在我的例子中是R.id.content)。我怎么才能得到这个?
我可以直接使用这个id,但是我想fragment不应该知道关于父Activity的这种细节。例如,在这种情况下,在另一个Activity中使用这个fragment是不可能的。
从另一个片段“开始”片段可能是一个不好的做法,所有片段处理逻辑都应该由Activity本身处理?但是创建彼此开始的片段的良好序列似乎非常有用(例如detalView-〉moreDetailView-〉evenMoreDetailView)。

but5z9lq

but5z9lq1#

您可以通过调用

((ViewGroup)getView().getParent()).getId();
kcwpcxri

kcwpcxri2#

我不知道我是否完全理解你的问题,但是你在onCreateView中得到容器,我想你可以把它藏在一个局部变量中。

public View onCreateView(LayoutInflater inflater, 
  ViewGroup container,
  Bundle savedInstanceState) {
  mContainer = container;
  ...
}
06odsfpq

06odsfpq3#

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

((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。

jchrr9hc

jchrr9hc4#

假设您在Activity类中有Fragment示例mCurrentFragment。您可以通过

int id = mCurrentFragment.getView().getParent().getId();
ViewGroup vg = (ViewGroup) findViewById(id); // Fragment's container View
cyvaqqii

cyvaqqii5#

Kotlin版本

val container = view?.parent as? ViewGroup ?: return

可以将其添加到“hand-dandy”扩展名中:

fun Fragment.container(): ViewGroup? {
    return view?.parent as? ViewGroup
}

那就把身份证拿来

container.id
container().id

相关问题