Можно ли создать индивидуальное предпочтение в PreferenceScreen
?
Я хотел бы закодировать такие цветовые настройки:
Я знаю, что выбор цвета легко реализуется с помощью ListPreference
, но это было бы потрясающе с такими "флажками".
Можно ли создать индивидуальное предпочтение в PreferenceScreen
?
Я хотел бы закодировать такие цветовые настройки:
Я знаю, что выбор цвета легко реализуется с помощью ListPreference
, но это было бы потрясающе с такими "флажками".
Страница Android Developer показывает только, как создать DialogFragment
. Тем не менее, можно настроить внешний вид элемента Preference
. В вашем XML вы должны объявить корневой элемент как android:id="@android:id/widget_frame
, а затем объявить TextView
как android:title
и android:summary
. Затем вы можете объявить другие элементы, которые хотите отображать в макете. Вот пример, показывающий SeekBar
который вы можете легко адаптировать для SeekBar
цвета с несколькими флажками.
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>
Это дает предпочтение, которое выглядит следующим образом:
Вы можете легко адаптировать этот метод для отображения нескольких флажков в строке, как это было в исходном вопросе.
Вот как я это делаю, используя библиотеку поддержки preference-v7
.
Preference
и переопределите onBindViewHolder()
. Этот метод позволяет вам получить ссылки на ваш предпочтительный вид через объект ViewHolder
.setWidgetLayoutResource()
или setLayoutResource()
в конструкторе.макет/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>
Создание пользовательских предпочтений аналогично созданию фрагмента или других компонентов пользовательского интерфейса, путем определения представлений и действий.
У разработчиков Android есть хорошее руководство по созданию настроек, в том числе раздел для создания пользовательских настроек: http://developer.android.com/guide/topics/ui/settings.html#Custom
Вы можете создать свой собственный макет для предпочтения, и вы можете установить его в атрибуте android:layout
в разделе "Предпочтение" в res/xml следующим образом:
<Preference
......................
android:layout="@layout/your_layout" />
Или вы можете использовать действие вместо предпочтения
Или лучшей альтернативой будет расширение класса DialogPreference. Вы можете установить виджет выбора цвета в виде диалогового окна и получить положительный результат внутри самого расширенного предпочтения. Здесь - это аналогичный вопрос, но он очень полезен для вашего сценария.