Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/224.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Android 添加一个片段作为ListView标题_Android_Android Listview_Android Fragments_Android Support Library - Fatal编程技术网

Android 添加一个片段作为ListView标题

Android 添加一个片段作为ListView标题,android,android-listview,android-fragments,android-support-library,Android,Android Listview,Android Fragments,Android Support Library,我的目标是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应用程序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>
但是我得到了一个错误,因为fragment.getView()返回null(api引用文档说我必须在add调用中放置GroupView Id,但是我应该将GroupView放在布局中的什么位置?
还有其他方法可以解决这个问题吗?

我通过创建一个新布局来解决这个问题,该布局只包含列表标题中所需的片段:

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

我想要一个不必求助于另一个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();

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

  • 生命周期事件被发布到UI线程
  • Fragment.onCreateView
    是一个生命周期事件
  • 活动。onCreate
    是一个生命周期事件
  • .getView()
    返回
    片段中创建的视图。onCreateView
  • 提交
    发布生命周期事件
结论:
commit
的结果在返回
onCreate
后的下一个循环中可见


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

我不确定这种方法是否可行,但片段的想法是创建一个框架布局设置一个id(您可以通过在参考资料中添加id名称来确定id),添加为标头,然后进行事务处理,将该id替换为碎片。不过,最好在ids.xml文件中声明该id,以确保不会有id重叠的风险。如果将标头容器添加到ListView而不是onCreate(请求后可提供支持),则应用程序会在onBackPressed()中崩溃,因为ListView会销毁子对象(您的标题容器)停止后-fragmentmanager不会将您的片段注入容器
LayoutInflater inflater = getLayoutInflater();
header = inflater.inflate(R.layout.myLayout, null);
listOfEvents.addHeaderView(header);

SortingStandardFragmenttitleFragment = (SortingStandardFragment) 
     getSupportFragmentManager()
          .findFragmentById(R.id.myFragmentEmbedded);
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();