如何从View中获取Fragment?

时间:2015-07-31 10:13:59

标签: android android-fragments

我在Fragment中添加了一些TableLayout,我想从我的容器Activity管理它们,所以我使用了这个:

Fragment fragment = (Fragment) tableLayout.getChildAt(i);

但是getChildAt(int)会返回ViewView无法投放到Fragment

3 个答案:

答案 0 :(得分:41)

我不明白为什么人们会对你的问题进行投票。 Fragments有时会非常混乱,特别是初学者。要了解您的问题,您必须了解Fragment是什么以及如何使用它们。

首先,View是屏幕上存在的东西。示例包括:TextViewEditTextButton等。它们位于XML"布局"内。这些布局使用Activity显示。

现在,Fragment不是View。屏幕上根本没有任何存在。相反,它是一个简单管理"布局" - 有点像Activity。如果您需要片段onCreateView()返回的视图,则可以在findViewById()中直接使用Activity

如果您需要对Fragment的引用,有两种可能的方法:

1)如果您以编程方式添加片段

getFragmentManager()
    .beginTransaction()
    .replace(R.id.fragment_container_viewgroup, myFragment, FRAGMENT_TAG)
    .commit();

您可以使用:

MyFragment myFragment = (MyFragment) getFragmentManager().findFragmentByTag(FRAGMENT_TAG);

2)如果你在这样的XML布局中添加了Fragment:

<fragment android:name="com.example.android.fragments.HeadlinesFragment"
    android:id="@+id/fragmentContainer"
    android:layout_weight="1"
    android:layout_width="0dp"
    android:layout_height="match_parent" />

您可以使用:

getFragmentManager().findFragmentById(R.id.fragmentContainer);

基本上,每个Activity都有一个FragmentManager类来维护所有活动的Fragments,并且有两种方法可以找到它们:使用您在显示片段时传递的唯一TAG,或者传递容器视图ID,其中添加了片段。

答案 1 :(得分:8)

对于希望从视图中实际获取Fragment对象的引用的人们来说,FragmentManager中现在有一种名为findFragment(View)reference)的方法

//in Java 
FragmentManager.findFragment(view)

//in Kotlin there is an extension function
view.findFragment()

请注意-如果未通过片段onCreateView添加视图,它将抛出IllegalStateException。

答案 2 :(得分:2)

你不能得到像这样的片段。您必须使用标记添加片段并通过该标记检索它。

添加片段请执行以下操作:

getFragmentManager().beginTransaction().add(R.id.container, fragment, "tagTofindFragment");

获取片段:

fragment = getFragmentManager().findFragmentByTag("tagTofindFragment");

此处tagTofindFragment是您的片段中应该唯一的标记。