Подтвердить что ты не робот

Android: создание пользовательских настроек

Можно ли создать индивидуальное предпочтение в PreferenceScreen?

Я хотел бы закодировать такие цветовые настройки:

Color Preference

Я знаю, что выбор цвета легко реализуется с помощью ListPreference, но это было бы потрясающе с такими "флажками".

4b9b3361

Ответ 1

Страница 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>

Это дает предпочтение, которое выглядит следующим образом:

Seekbar preference item

Вы можете легко адаптировать этот метод для отображения нескольких флажков в строке, как это было в исходном вопросе.

Ответ 2

Вот как я это делаю, используя библиотеку поддержки preference-v7.

  • Расширьте Preference и переопределите onBindViewHolder(). Этот метод позволяет вам получить ссылки на ваш предпочтительный вид через объект ViewHolder.
  • Раздуйте свой пользовательский вид, используя setWidgetLayoutResource() или setLayoutResource() в конструкторе.
  • Отключите поведение по умолчанию для всего представления предпочтений и разрешите кликать только настраиваемые виды внутри.

preference

макет/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>

Ответ 3

Создание пользовательских предпочтений аналогично созданию фрагмента или других компонентов пользовательского интерфейса, путем определения представлений и действий.

У разработчиков Android есть хорошее руководство по созданию настроек, в том числе раздел для создания пользовательских настроек: http://developer.android.com/guide/topics/ui/settings.html#Custom

Ответ 4

Вы можете создать свой собственный макет для предпочтения, и вы можете установить его в атрибуте android:layout в разделе "Предпочтение" в res/xml следующим образом:

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

Или вы можете использовать действие вместо предпочтения

Ответ 5

Или лучшей альтернативой будет расширение класса DialogPreference. Вы можете установить виджет выбора цвета в виде диалогового окна и получить положительный результат внутри самого расширенного предпочтения. Здесь - это аналогичный вопрос, но он очень полезен для вашего сценария.