为什么 android.R.id.list 的父级是 FrameLayout 而不是 Android N 中的 LInearLayout
Why android.R.id.list 's parent is FrameLayout not LInearLayout in Android N
我得到 preferenceScreen
的父布局低于 Android N 是以下代码:
final Dialog dialog = preferenceScreen.getDialog();
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.ICE_CREAM_SANDWICH) {
Log.d("TAG",dialog.findViewById(android.R.id.list).getParent().getClass()+"");
LinearLayout root = (LinearLayout) dialog.findViewById(android.R.id.list).getParent();
} else {
ViewGroup root = (ViewGroup) dialog.findViewById(android.R.id.content);
}
这是 Android 源代码中 PreferenceScreen 的布局:
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:orientation="vertical"
android:layout_height="match_parent"
android:layout_width="match_parent"
android:background="@android:color/transparent"
android:layout_removeBorders="true">
<ListView android:id="@android:id/list"
style="?attr/preferenceFragmentListStyle"
android:layout_width="match_parent"
android:layout_height="0px"
android:layout_weight="1"
android:paddingTop="0dip"
android:paddingBottom="@dimen/preference_fragment_padding_bottom"
android:scrollbarStyle="@integer/preference_fragment_scrollbarStyle"
android:clipToPadding="false"
android:drawSelectorOnTop="false"
android:cacheColorHint="@android:color/transparent"
android:scrollbarAlwaysDrawVerticalTrack="true" />
......other widget......
</LinearLayout>
它在低于 Android N 时运行良好,但是当我 运行 我的应用程序在 Android N 时,显示错误 ListView id 是 android.R.id.list 是 FrameLayout 而不是 LinearLayout。
Android源码解释是LinearLayout不是FrameLayout,但为什么报错?
在一个子视图中使用 FrameLayout
而不是 LinearLayout
是有意义的。这种变化很可能是永久性的。从已删除的答案和评论中,我看到您正在使用此 library and this question is related to this issue on GitHub.
我的建议是停止使用该库。您应该使用 PreferenceFragment
而不是已弃用的 PreferenceActivity
。如果你想在 pre-L 上使用 material 设计,你应该使用官方的 v7 preference support library。然而,最后我检查了这有一些陷阱。
我得到 preferenceScreen
的父布局低于 Android N 是以下代码:
final Dialog dialog = preferenceScreen.getDialog();
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.ICE_CREAM_SANDWICH) {
Log.d("TAG",dialog.findViewById(android.R.id.list).getParent().getClass()+"");
LinearLayout root = (LinearLayout) dialog.findViewById(android.R.id.list).getParent();
} else {
ViewGroup root = (ViewGroup) dialog.findViewById(android.R.id.content);
}
这是 Android 源代码中 PreferenceScreen 的布局:
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:orientation="vertical"
android:layout_height="match_parent"
android:layout_width="match_parent"
android:background="@android:color/transparent"
android:layout_removeBorders="true">
<ListView android:id="@android:id/list"
style="?attr/preferenceFragmentListStyle"
android:layout_width="match_parent"
android:layout_height="0px"
android:layout_weight="1"
android:paddingTop="0dip"
android:paddingBottom="@dimen/preference_fragment_padding_bottom"
android:scrollbarStyle="@integer/preference_fragment_scrollbarStyle"
android:clipToPadding="false"
android:drawSelectorOnTop="false"
android:cacheColorHint="@android:color/transparent"
android:scrollbarAlwaysDrawVerticalTrack="true" />
......other widget......
</LinearLayout>
它在低于 Android N 时运行良好,但是当我 运行 我的应用程序在 Android N 时,显示错误 ListView id 是 android.R.id.list 是 FrameLayout 而不是 LinearLayout。 Android源码解释是LinearLayout不是FrameLayout,但为什么报错?
在一个子视图中使用 FrameLayout
而不是 LinearLayout
是有意义的。这种变化很可能是永久性的。从已删除的答案和评论中,我看到您正在使用此 library and this question is related to this issue on GitHub.
我的建议是停止使用该库。您应该使用 PreferenceFragment
而不是已弃用的 PreferenceActivity
。如果你想在 pre-L 上使用 material 设计,你应该使用官方的 v7 preference support library。然而,最后我检查了这有一些陷阱。