Я продолжаю видеть учебное пособие по добавлению вашего собственного предпочтения, но его не в моем фактическом prefs.xml. Есть ли способ иметь его на моем главном экране prefs или мне придется его разделить.Есть ли способ добавить поисковую панель к экрану фактических настроек?
ответ
Там, кажется, 2 слайдера предпочтения по Google -
- SeekBarPreference - инлайн
- SeekBarDialogPreference - диалог на основе
, но я не уверен, когда они будут доступны.
Вы можете использовать пользовательские встроенныйSeekBarPreference мной (см 2 ползунки в нижней части):
Мой код довольно прост -
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);
}
}
<?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>
Для некоторых Причина 'notifyChanged()' в функции 'setValue()' не приводит к тому, что моя 'Preference.OnPreferenceChangeListener.onPreferenceChange()' будет вызвана. Вместо этого мне пришлось заменить 'notifyChanged()' на 'callChangeListener (value)', чтобы он вызывался. Постскриптум Я регистрирую обратный вызов с помощью 'preference.setOnPreferenceChangeListener()'. – reubenjohn
Кирк Baucom недавно опубликовал код, чтобы сделать именно это: [Android SeekBar предпочтение] (http://robobunny.com/wp/2011/08/13/android-seekbar-preference/) – ehartwell