Android:创build自定义首选项

是否有可能在PreferenceScreen创build个人PreferenceScreen

我想要这样的代码颜色设置:

颜色偏好

我知道用ListPreference很容易实现select颜色,但是用这种“checkbox”会很棒。

Android开发人员页面仅显示如何创buildDialogFragment。 尽pipe如此,仍然可以自定义首选项的外观。 在您的XML中,您必须将根元素声明为id:widget_frame,然后将textviews声明为title和summary。 然后你可以声明你想在布局中出现的其他元素。 下面是一个示例,显示一个SeekBar,您可以轻松地适应多选框颜色select器。

seekbar_preference.xml

 <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:id="@android:id/widget_frame" android:layout_width="match_parent" android:layout_height="match_parent" android:orientation="vertical" > <TextView android:id="@android:id/title" style="@android:style/TextAppearance.DeviceDefault.SearchResult.Title" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="Title" /> <TextView android:id="@android:id/summary" style="@android:style/TextAppearance.DeviceDefault.SearchResult.Subtitle" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="Summary" /> <SeekBar android:id="@+id/seekbar" android:layout_width="match_parent" android:layout_height="wrap_content" /> </LinearLayout> 

然后,在派生自Preference的类中,重写onCreateView方法:

SeekbarPreference.java

 @Override protected View onCreateView( ViewGroup parent ) { LayoutInflater li = (LayoutInflater)getContext().getSystemService( Context.LAYOUT_INFLATER_SERVICE ); return li.inflate( R.layout.seekbar_preference, parent, false); } 

然后在preferences.xml文件中使用首选项:

的preferences.xml

 <PreferenceScreen xmlns:android="http://schemas.android.com/apk/res/android" > <com.example.SeekbarPreference android:key="pref_max_volume" android:title="@string/max_volume" /> <com.example.SeekbarPreference android:key="pref_balance" android:title="@string/balance" /> </PreferenceScreen> 

这给了一个偏好,如下所示:

Seekbar偏好项目

你可以很容易地调整这个方法,像在原始问题中一样在一行上显示多个checkbox。

这是我如何使用支持库preference-v7

  • 扩展Preference并覆盖onBindViewHolder() 。 此方法允许您通过ViewHolder对象获取对您的偏好视图的ViewHolder
  • 使用构造函数中的setWidgetLayoutResourece()setLayoutResource()setWidgetLayoutResourece()自定义视图。
  • 禁用整个首选项视图的默认点击行为,只允许自定义视图可点击。

偏爱

布局/ preference_theme.xml

 <?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:orientation="horizontal" android:layout_width="match_parent" android:layout_height="wrap_content"> <Button android:id="@+id/theme_light" ... /> <Button android:id="@+id/theme_dark"... /> <Button android:id="@+id/theme_sepia"... /> <Button android:id="@+id/theme_green"... /> </LinearLayout> 

PreferenceTheme.java (自定义偏好类)

 import android.support.v7.preference.Preference; import android.support.v7.preference.PreferenceViewHolder; public class PreferenceTheme extends Preference { public PreferenceTheme(Context context, AttributeSet attrs) { this(context, attrs, 0); } public PreferenceTheme(Context context, AttributeSet attrs, int defStyleAttr) { super(context, attrs, defStyleAttr); setWidgetLayoutResource(R.layout.preference_theme); } @Override public void onBindViewHolder(PreferenceViewHolder holder) { super.onBindViewHolder(holder); holder.itemView.setClickable(false); // disable parent click View button = holder.findViewById(R.id.theme_dark); button.setClickable(true); // enable custom view click button.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { // persist your value here } }); // the rest of the click binding } } 

的preferences.xml

 <?xml version="1.0" encoding="utf-8"?> <android.support.v7.preference.PreferenceScreen xmlns:android="http://schemas.android.com/apk/res/android" xmlns:app="http://schemas.android.com/apk/res-auto" android:layout_width="match_parent" android:layout_height="match_parent"> <android.support.v7.preference.PreferenceCategory android:title="Reading"> <example.com.preference.PreferenceTheme android:key="pref_theme" android:title="Theme" android:defaultValue="light" /> ... </android.support.v7.preference.PreferenceCategory> </android.support.v7.preference.PreferenceScreen> 

通过定义视图和操作,创build自定义首选项与创build片段或其他UI组件类似。

Android开发者在创build设置方面有很好的指导,其中包括创build自定义首选项的部分: http : //developer.android.com/guide/topics/ui/settings.html#Custom

你可以创build你喜欢的自定义布局,你可以在res / xml中的Preference中的android:layout属性中设置它,如下所示:

 <Preference ...................... android:layout="@layout/your_layout" /> 

或者你可以使用一个活动,而不是偏好

或者更好的select是扩展DialogPreference类。 您可以将颜色select器小部件设置为对话视图,并在扩展偏好本身内获得肯定的结果。 这里有一个类似的问题,但对于你的情况非常有用。