我将Android应用程序定位到API 15且最低为8.因此我使用支持库来管理片段。我有一组片段,我在应用程序的几个部分使用。
现在,在一个活动中,我在布局中有一个ListView:
<ListView xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:id="@+id/listOfEvents"
android:layout_width="match_parent" android:layout_height="match_parent">
</ListView>
我想在ListView标题中添加我的一个片段。我试过这个:
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.event_open);
listOfEvents = (ListView) findViewById(R.id.listOfEvents);
Fragment fragment = new SortingStandardFragment();
getSupportFragmentManager()
.beginTransaction()
.add(fragment, null)
.commit();
View fragmentView = fragment.getView(); // problem: fragment is null!
listOfEvents.addHeaderView(fragmentView);
}
但是我得到一个错误,因为fragment.getView()返回null(api引用文档说我必须在add调用中放置GroupView Id,但是我应该在哪里放置GroupView? 还有另一种方法可以达到目标吗?
答案 0 :(得分:14)
我通过在列表标题中创建一个只包含我需要的片段的新布局来解决这个问题:
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent">
<fragment
android:id="@+id/myFragmentEmbedded"
android:name=".SortingStandardFragment"
android:layout_width="match_parent"
android:layout_height="wrap_content" />
</LinearLayout>
并在活动代码中:
LayoutInflater inflater = getLayoutInflater();
header = inflater.inflate(R.layout.myLayout, null);
listOfEvents.addHeaderView(header);
SortingStandardFragmenttitleFragment = (SortingStandardFragment)
getSupportFragmentManager()
.findFragmentById(R.id.myFragmentEmbedded);
答案 1 :(得分:4)
我想要一个版本而不必求助于另一个xml文件,所以在这里:
Fragment fragment = ...
FrameLayout v = new FrameLayout(getActivity());
v.setId(42);
listView.addHeaderView(v, null, false);
FragmentManager fm = getActivity().getSupportFragmentManager();
fm.beginTransaction().add(v.getId(), fragment).commit();
答案 2 :(得分:1)
如果有人好奇为什么他的第一次尝试失败了:
Fragment.onCreateView
是生命周期事件Activity.onCreate
是生命周期事件.getView()
返回Fragment.onCreateView
commit
发布生命周期事件结论:commit
的结果在onCreate
返回后的下一个循环中可见。
在阅读相关文档后,可以尝试强制commit
与getSupportFragmentManager().executePendingTransactions()
立即联系。