preference android:layout,自定义PreferenceScreen的布局
我的要求
注意:我需要支持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的布局的全部內容,希望文章能夠幫你解決所遇到的問題。
 
                            
                        - 上一篇: RBF(径向基函数)神经网络
- 下一篇: 单片机毕业设计不用愁!!30篇单片机毕业
