preference android:layout,自定义PreferenceScreen的布局

preference android:layout,自定义PreferenceScreen的布局我的要求注意:我需要支持AndroidAPI15及更高版本。在我的PreferenceFragment中,我正在将PreferenceScreen动态添加到PreferenceCategory。PreferenceScreenas=mgr.createPreferenceScreen(context);as.setTitle(name);myCategory.addPreferenc…

我的要求

注意:我需要支持Android API 15及更高版本。

在我的PreferenceFragment中,我正在将PreferenceScreen动态添加到PreferenceCategory。

PreferenceScreen as = mgr.createPreferenceScreen(context); as.setTitle(name); myCategory.addPreference(as);

当设置活动呈现时,这些PreferenceScreens仅在其行的标题中呈现,请参见下图。

inPnd.png

我想自定义此行中显示的内容。 理想情况下,我希望有一个标题,下面有摘要,标题/摘要左侧的图标,右侧的图标。 请参阅下面的模型图像。

FdGvf.png

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

这将产生如下的UI

K5TaL.png

这让我更接近我想要的但仍然不是我想要的(错过了行开头的图标)。

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

我的布局是

扩展PreferenceScreen

我查看了扩展的PreferenceScreen以覆盖它呈现的方式,但看起来这个类现在已经成为最终版,所以互联网上以这种方式执行的所有示例都无法使用。

我设法让这个工作。

Preference类使用com.android.internal.R.layout.preference作为其布局。 这包含左侧图标的ImageView,然后是标题和摘要widget_frame视图,最后是右侧的widget_frame布局。

通过调用“ PreferenceScreen.setIcon(..) ”,您可以将drawable设置为放置在图标图像视图中。 通过调用PreferenceScreen.setWidgetLayoutResource(“…”)您可以将布局设置为widget_frame布局,在我的情况下,我放置一个包含我的图像的ImageView布局。

这是我的Java代码。

PreferenceScreen as = mgr.createPreferenceScreen(context); as.setTitle(name); as.setSummary(summary); // add an icon to the PreferenceScreen, // this is rendered on the left hand side of the row accountScreen.setIcon(R.drawable.my_pref_icon); // specify the layout to inflate into the widget area on the // right hand side of the row, this layout is just my image as.setWidgetLayoutResource(R.layout.as_widget); myCategory.addPreference(as);

这会产生如下布局

OQey3.png

这种布局的问题在于图标不会与下面没有图标的首选项文本对齐。

这也可以通过指定PreferenceScreen的布局来解决。 我将Android的preference.xml复制到我的项目中(为我的用例重新命名)并且我将ImageView更改为左边填充和0dp的边距。

然后,我为PreferenceScreen的布局指定了我的preference.xml副本。 所以我的java现在

PreferenceScreen as = mgr.createPreferenceScreen(context); as.setTitle(name); as.setSummary(summary); // add an icon to the PreferenceScreen, // this is rendered on the left hand side of the row accountScreen.setIcon(R.drawable.my_pref_icon); // specify the layout to inflate into the widget area on the // right hand side of the row, this layout is just my image as.setWidgetLayoutResource(R.layout.as_widget); // specify the layout for the preference screen row when it is // rendered as a row in a preference activity/fragment as.setLayoutResource(R.layout.preference_row_layout); myCategory.addPreference(as);

我相信我最初尝试使用PreferenceScreen.setLayoutResource的原因是因为我指定的布局不正确。 不正确的布局使整个布局的id为@android:id/widget_frame ,即

…..

正确的布局不需要主布局的id,但需要包含带有@+android:id/icon , @+android:id/title , @+android:id/summary , @+android:id/widget_frame id的子视图 @+android:id/widget_frame ,即

…. …….. ….

您还可以通过重写Preference.onCreateView(parent)来自定义Preference.onCreateView(parent)的布局。 下面的示例使用匿名内部类来创建红色首选项。

screen.addPreference( new Preference(context) { @Override protected View onCreateView(ViewGroup parent) { View view = super.onCreateView(parent); view.setBackgroundColor(Color.RED); return view; } });

今天的文章preference android:layout,自定义PreferenceScreen的布局分享到此就结束了,感谢您的阅读,如果确实帮到您,您可以动动手指转发给其他人。

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。
如需转载请保留出处:https://bianchenghao.cn/25877.html

(0)
编程小号编程小号

相关推荐

发表回复

您的电子邮箱地址不会被公开。 必填项已用*标注