我在Fragment
中添加了一些TableLayout
,我想从我的容器Activity
管理它们,所以我使用了这个:
Fragment fragment = (Fragment) tableLayout.getChildAt(i);
但是getChildAt(int)
会返回View
而View
无法投放到Fragment
答案 0 :(得分:41)
我不明白为什么人们会对你的问题进行投票。 Fragments
有时会非常混乱,特别是初学者。要了解您的问题,您必须了解Fragment
是什么以及如何使用它们。
首先,View
是屏幕上存在的东西。示例包括:TextView
,EditText
,Button
等。它们位于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
是您的片段中应该唯一的标记。