studio programacion activity android dialog numberpicker

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>



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; } }