5

我的目标是 API 15 和最低 8 的 android 应用程序。所以我使用支持库来管理片段。我有一组在应用程序的几个部分中使用的片段。

现在,在一个活动中,我在布局中有一个 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 放在布局中的哪个位置?还有另一种方法可以达到目的吗? ?

4

3 回答 3

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);
于 2012-09-30T21:22:11.980 回答
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();
于 2014-02-05T20:10:56.903 回答
1

如果有人好奇为什么他的第一次尝试失败了:

  • 生命周期事件发布到 UI 线程
  • Fragment.onCreateView是一个生命周期事件
  • Activity.onCreate是一个生命周期事件
  • .getView()返回创建的视图Fragment.onCreateView
  • commit发布生命周期事件

结论:commit从返回后的下一个循环中可以看到结果onCreate

阅读文档后,可以尝试强制commit立即使用。getSupportFragmentManager().executePendingTransactions()

于 2014-11-13T16:40:11.280 回答