我的要求
注意:我需要支持Android API 15及更高版本。
在我的PreferenceFragment中,我正在将PreferenceScreen动态添加到PreferenceCategory。
PreferenceScreen as = mgr.createPreferenceScreen(context); as.setTitle(name); myCategory.addPreference(as);
当设置活动呈现时,这些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”是
这将产生如下的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);
我的布局是
扩展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);
这会产生如下布局
这种布局的问题在于图标不会与下面没有图标的首选项文本对齐。
这也可以通过指定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