2012-01-26 5 views
4

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

+0

Кирк Baucom недавно опубликовал код, чтобы сделать именно это: [Android SeekBar предпочтение] (http://robobunny.com/wp/2011/08/13/android-seekbar-preference/) – ehartwell

ответ

9

Там, кажется, 2 слайдера предпочтения по Google -

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

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

screenshot

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

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> 
+0

Для некоторых Причина 'notifyChanged()' в функции 'setValue()' не приводит к тому, что моя 'Preference.OnPreferenceChangeListener.onPreferenceChange()' будет вызвана. Вместо этого мне пришлось заменить 'notifyChanged()' на 'callChangeListener (value)', чтобы он вызывался. Постскриптум Я регистрирую обратный вызов с помощью 'preference.setOnPreferenceChangeListener()'. – reubenjohn