我的要求
注意:我需要支持 Android API 15 及更高版本。
在我的 PreferenceFragment 中,我将 PreferenceScreen 动态添加到 PreferenceCategory。
PreferenceScreen as = mgr.createPreferenceScreen(context);
as.setTitle(name);
myCategory.addPreference(as);
当设置 Activity 呈现这些 PreferenceScreens 时,它们的行中只有一个标题,请参见下图。
我想自定义此行中显示的内容。理想情况下,我希望标题下方有一个摘要,标题/摘要左侧有一个图标,并且在某些行的右侧有一个图标。请参阅下面的样机图像。
PreferenceScreen.setWidgetLayoutResource(int widgetLayoutResId)
我知道我可以使用“setWidgetLayoutResource”在我的设置活动中使用以下代码在行布局的右侧添加一个图标(以及带有“setSummary”的摘要)
PreferenceScreen as = mgr.createPreferenceScreen(context);
as.setTitle(name);
as.setSummary(summary);
as.setWidgetLayoutResource(R.layout.as_widget);
myCategory.addPreference(as);
“as_widget.xml”在哪里
<?xml version="1.0" encoding="utf-8"?>
<ImageView
xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:src="@drawable/ic_action_favorite"/>
这将产生如下 UI
这让我更接近我想要的,但仍然不是我想要的(缺少行开头的图标)。
PreferenceScreen.setLayoutResource(int layoutResId)
我相信如果我使用它,那么我可以控制整行的渲染。我在stackoverflow上看到过这样的例子,比如
据我了解,您指定的布局文件必须具有以下内容
- 它的根视图,ID 为“@android:id/widget_frame”
- id 为 android:id="@+android:id/title" 的视图(这是放置 PreferenceScreen.setTitle 中指定的字符串的位置)
- id 为 android:id="@+android:id/summary" 的视图(这是放置 PreferenceScreen.setSummary 中指定的字符串的位置)
但是,当我尝试这样做时,Android Studio 会突出显示“@+android:id/summary”,并显示错误“无法解析符号 '@+android:id/summary'。当应用程序运行时,我的行完全呈现为空白。
我的Java是
PreferenceScreen as = mgr.createPreferenceScreen(context);
as.setTitle(name);
as.setSummary(summary);
as.setLayoutResource(R.layout.as_row_layout);
myCategory.addPreference(as);
我的布局是
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:id="@android:id/widget_frame"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:minHeight="?android:attr/listPreferredItemHeight"
android:gravity="center_vertical"
android:paddingRight="?android:attr/scrollbarSize">
<ImageView
android:id="@+id/icon1"
android:src="@drawable/ic_action_email"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="center" />
<RelativeLayout
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginLeft="15dip"
android:layout_marginRight="6dip"
android:layout_marginTop="6dip"
android:layout_marginBottom="6dip"
android:layout_weight="1">
<TextView android:id="@+android:id/title"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:singleLine="true"
android:textAppearance="?android:attr/textAppearanceLarge"
android:ellipsize="marquee"
android:fadingEdge="horizontal" />
<TextView android:id="@+android:id/summary"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_below="@android:id/title"
android:layout_alignLeft="@android:id/title"
android:textAppearance="?android:attr/textAppearanceSmall"
android:textColor="?android:attr/textColorSecondary"
android:maxLines="4" />
</RelativeLayout>
<ImageView
android:id="@+id/icon2"
android:src="@drawable/ic_action_favorite"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="center" />
</LinearLayout>
扩展 PreferenceScreen
我查看了扩展的 PreferenceScreen 以覆盖它的呈现方式,但似乎这个类现在已经成为最终的,所以互联网上所有这样做的例子都不能使用。