【发布时间】:2016-06-28 06:28:32
【问题描述】:
我的 PreferenceFragmentCompat 需要一个自定义布局。在PreferenceFragmentCompat 的文档中,您似乎可以在 onCreateView() 中膨胀并返回一个视图。
但是 NPE 结果:-
Caused by: java.lang.NullPointerException: Attempt to invoke virtual method 'void android.support.v7.widget.RecyclerView.setAdapter(android.support.v7.widget.RecyclerView$Adapter)' on a null object reference
at android.support.v7.preference.PreferenceFragmentCompat.bindPreferences(PreferenceFragmentCompat.java:511)
at android.support.v7.preference.PreferenceFragmentCompat.onActivityCreated(PreferenceFragmentCompat.java:316)
at com.cls.example.MyPrefFrag.onActivityCreated(MyPrefFrag.java:42)
在我检查了 PreferenceFragmentCompat:onCreateView 的来源后,我发现了以下代码:-
RecyclerView listView = this.onCreateRecyclerView(themedInflater, listContainer, savedInstanceState);
if(listView == null) {
throw new RuntimeException("Could not create RecyclerView");
} else {
this.mList = listView; //problem
...
return view;
}
因此,如果您覆盖 onCreateView() 并返回自定义布局,则不会调用 onCreateRecyclerView() 并且不会设置 RecyclerView 私有字段 mList。所以 setAdapter() 上的 NPE 结果。
我是否应该假设 PreferenceFragmentCompat 无法使用自定义布局?
【问题讨论】:
-
PreferenceFragment(Compat) 旨在为设置提供标准 UI。请问,为什么要使用自定义布局?无论如何,如果您真的需要,您可以使用带有自定义首选项处理的自定义布局。
-
我在自定义布局的开头得到了一个自定义视图,该视图会随着每个首选项的变化而变化。使用本机 PreferenceFragment 很容易。您只需在自定义布局中嵌入一个 id=android:id/list 的列表视图。 PreferencefragmentCompat 似乎没有类似的功能。
-
您可以通过覆盖
onCreateRecyclerView(...)来执行相同操作,这应该从您的布局中返回 RecyclerView。 -
这不符合我的要求。回收站视图用于首选项。我需要自定义布局。
-
那么你必须以自己的方式实现它。
PreferenceFragmentCompat用于标准布局,它在幕后没有什么特别的作用,因此使用经典的SharedPreferences使用自定义业务逻辑实现自定义设置 UI 应该不是问题。
标签: android android-support-library preferencefragment