Есть ли способ добавить панель поиска на мой фактический экран предпочтений?

Я продолжаю видеть руководство по добавлению собственных настроек панели поиска, но его нет в моем фактическом файле prefs.xml. Есть ли способ сделать его на моем главном экране настроек или мне придется его отделить.


person VicVu    schedule 26.01.2012    source источник
comment
Кирк Бауком недавно опубликовал код, который делает именно это: Настройки Android SeekBar.   -  person ehartwell    schedule 08.04.2012


Ответы (1)


Кажется, у Google есть 2 настройки ползунка -

но я не уверен, когда они будут доступны.

Вы можете использовать собственный встроенный SeekBarPreference мной (см. 2 ползунка внизу):

скриншот

Мой код довольно прост -

SeekBarPreference.java:

public class SeekBarPreference extends Preference implements OnSeekBarChangeListener {
    private SeekBar mSeekBar;
    private int mProgress;

    public SeekBarPreference(Context context) {
        this(context, null, 0);
    }

    public SeekBarPreference(Context context, AttributeSet attrs) {
        this(context, attrs, 0);
    }

    public SeekBarPreference(Context context, AttributeSet attrs, int defStyle) {
        super(context, attrs, defStyle);
        setLayoutResource(R.layout.preference_seekbar);
    }

    @Override
    protected void onBindView(View view) {
        super.onBindView(view);
        mSeekBar = (SeekBar) view.findViewById(R.id.seekbar);
        mSeekBar.setProgress(mProgress);
        mSeekBar.setOnSeekBarChangeListener(this);
    }

    @Override
    public void onProgressChanged(SeekBar seekBar, int progress, boolean fromUser) {
        if (!fromUser)
            return;

        setValue(progress);
    }

    @Override
    public void onStartTrackingTouch(SeekBar seekBar) {
        // not used
    }

    @Override
    public void onStopTrackingTouch(SeekBar seekBar) {
        // not used
    }

    @Override
    protected void onSetInitialValue(boolean restoreValue, Object defaultValue) {
        setValue(restoreValue ? getPersistedInt(mProgress) : (Integer) defaultValue);
    }

    public void setValue(int value) {
        if (shouldPersist()) {
            persistInt(value);
        }

        if (value != mProgress) {
            mProgress = value;
            notifyChanged();
        }
    }

    @Override
    protected Object onGetDefaultValue(TypedArray a, int index) {
        return a.getInt(index, 0);
    }
}

И preference_seekbar.xml:

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:gravity="center_vertical" >

    <SeekBar
        android:id="@+id/seekbar"
        android:layout_width="0dp"
        android:layout_weight="80"
        android:layout_height="wrap_content" />

    <TextView
        android:id="@android:id/summary"
        android:layout_width="0dp"
        android:layout_weight="20"
        android:layout_height="wrap_content" />

</LinearLayout>
person Alexander Farber    schedule 14.05.2015
comment
По какой-то причине notifyChanged() в функции setValue() не вызывает мой Preference.OnPreferenceChangeListener.onPreferenceChange(). Вместо этого мне пришлось заменить notifyChanged() на callChangeListener(value), чтобы он вызывался. P.S. Я регистрирую обратный вызов с помощью preference.setOnPreferenceChangeListener(). - person reubenjohn; 24.12.2016