programacion - preferences android
Diálogo de Android PreferenceActivity con selector de números (2)
He visto muchas soluciones personalizadas y respuestas a esta pregunta. Necesito algo muy simple, tengo una actividad de preferencia y todo lo que necesito es que una de las opciones abrirá el diálogo con un selector de números y guardará los resultados. ¿Puede por favor guiarme paso a paso sobre cómo lograr esto?
public class SettingsActivity extends PreferenceActivity
{
@Override
protected void onCreate(final Bundle savedInstanceState)
{
super.onCreate(savedInstanceState);
getFragmentManager().beginTransaction().replace(android.R.id.content, new MyPreferenceFragment()).commit();
//requestWindowFeature(Window.FEATURE_NO_TITLE);
}
public static class MyPreferenceFragment extends PreferenceFragment
{
@Override
public void onCreate(final Bundle savedInstanceState)
{
super.onCreate(savedInstanceState);
addPreferencesFromResource(R.xml.prefs);
}
}
}
XML:
<SwitchPreference
android:key="cross"
android:summaryOff="Cross is invisible"
android:summaryOn="Cross is visible"
android:switchTextOff="OFF"
android:switchTextOn="ON"
android:title="Cross"
android:defaultValue="true"/>
<SwitchPreference
android:key="autoP"
android:summaryOff="App will go to sleep"
android:summaryOn="App will not go to sleep"
android:switchTextOff="OFF"
android:switchTextOn="ON"
android:title="Always On"
android:defaultValue="true"/>
<SwitchPreference
android:key="tempD"
android:summaryOff="Temprature not displayed"
android:summaryOn="Temprature displayed"
android:switchTextOff="OFF"
android:switchTextOn="ON"
android:title="Tempature Display"
android:defaultValue="true"/>
<ListPreference
android:entries="@array/units"
android:entryValues="@array/lunits"
android:key="listUnits"
android:summary="Units schosssing"
android:title="Units" android:defaultValue="C"/>
<!--Need to add button to open dialog-->
</PreferenceScreen>
Selector de números XML:
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="fill_parent"
android:layout_height="fill_parent" >
<NumberPicker
android:id="@+id/numberPicker1"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_alignParentTop="true"
android:layout_centerHorizontal="true"
android:layout_marginTop="64dp" />
<Button
android:id="@+id/button2"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_below="@+id/numberPicker1"
android:layout_marginLeft="20dp"
android:layout_marginTop="98dp"
android:layout_toRightOf="@+id/numberPicker1"
android:text="Cancel" />
<Button
android:id="@+id/button1"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_alignBaseline="@+id/button2"
android:layout_alignBottom="@+id/button2"
android:layout_marginRight="16dp"
android:layout_toLeftOf="@+id/numberPicker1"
android:text="Set" />
</RelativeLayout>
Implementar DialogPreference
es una solución:
- NumberPicker Preference Dialog para Android es realmente simple.
- O revise esta pregunta resuelta: Cree el cuadro de diálogo NumberPicker en preferencia
Subclase DialogPreference
para construir su propio NumberPickerPreference
.
He implementado uno abajo para ti. Funciona perfectamente bien, pero no está completa la función. Por ejemplo, los valores mínimo y máximo son constantes codificadas. Estos realmente deberían ser atributos en la declaración xml de preferencia. Para que funcione, deberá agregar un archivo attrs.xml que especifique sus atributos personalizados.
Para la implementación completa del widget de preferencias NumberPicker que admite atributos xml personalizados en un proyecto de biblioteca y una aplicación de demostración que muestra cómo usarlo, consulte GitHub: https://github.com/Alobar/AndroidPreferenceTest
Usaría el widget como cualquier otro widget de preferencia, excepto que debe calificar completamente el nombre:
preferences.xml
<PreferenceScreen xmlns:android="http://schemas.android.com/apk/res/android">
<com.example.preference.NumberPickerPreference
android:key="key_number"
android:title="Give me a number"
android:defaultValue="55" />
</PreferenceScreen>
NumberPickerPreference.java
package com.example.preference;
import android.content.Context;
import android.content.res.TypedArray;
import android.preference.DialogPreference;
import android.util.AttributeSet;
import android.view.Gravity;
import android.view.View;
import android.view.ViewGroup;
import android.widget.FrameLayout;
import android.widget.NumberPicker;
/**
* A {@link android.preference.Preference} that displays a number picker as a dialog.
*/
public class NumberPickerPreference extends DialogPreference {
// allowed range
public static final int MAX_VALUE = 100;
public static final int MIN_VALUE = 0;
// enable or disable the ''circular behavior''
public static final boolean WRAP_SELECTOR_WHEEL = true;
private NumberPicker picker;
private int value;
public NumberPickerPreference(Context context, AttributeSet attrs) {
super(context, attrs);
}
public NumberPickerPreference(Context context, AttributeSet attrs, int defStyleAttr) {
super(context, attrs, defStyleAttr);
}
@Override
protected View onCreateDialogView() {
FrameLayout.LayoutParams layoutParams = new FrameLayout.LayoutParams(
ViewGroup.LayoutParams.WRAP_CONTENT, ViewGroup.LayoutParams.WRAP_CONTENT);
layoutParams.gravity = Gravity.CENTER;
picker = new NumberPicker(getContext());
picker.setLayoutParams(layoutParams);
FrameLayout dialogView = new FrameLayout(getContext());
dialogView.addView(picker);
return dialogView;
}
@Override
protected void onBindDialogView(View view) {
super.onBindDialogView(view);
picker.setMinValue(MIN_VALUE);
picker.setMaxValue(MAX_VALUE);
picker.setWrapSelectorWheel(WRAP_SELECTOR_WHEEL);
picker.setValue(getValue());
}
@Override
protected void onDialogClosed(boolean positiveResult) {
if (positiveResult) {
picker.clearFocus();
int newValue = picker.getValue();
if (callChangeListener(newValue)) {
setValue(newValue);
}
}
}
@Override
protected Object onGetDefaultValue(TypedArray a, int index) {
return a.getInt(index, MIN_VALUE);
}
@Override
protected void onSetInitialValue(boolean restorePersistedValue, Object defaultValue) {
setValue(restorePersistedValue ? getPersistedInt(MIN_VALUE) : (Integer) defaultValue);
}
public void setValue(int value) {
this.value = value;
persistInt(this.value);
}
public int getValue() {
return this.value;
}
}