Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Android PreferenceActivity dialog with number picker

Tags:

I have seen many customized solutions and answers to this question. I need something very simple, I have a preference activity and all I need is that one of the options will open dialog with a number picker and save the results. Can you please guide me step by step with how to accomplish this?

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> 

Number Picker 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> 
like image 408
Dim Avatar asked Dec 24 '13 10:12

Dim


1 Answers

Subclass DialogPreference to build your own NumberPickerPreference.

I have implemented one below for you. It works perfectly fine, but is not feature complete. For example the minimum and maximum values are hard-coded constants. These should really be attributes on the preference xml declaration. To get that to work you would need to add an attrs.xml file specifying your custom attributes.

For the full implementation of the NumberPicker preference widget that supports custom xml attributes in a library project and a demo app showing how to use it, see GitHub: https://github.com/Alobar/AndroidPreferenceTest

You would use the widget as any other preference widget, except you have to fully qualify the name:

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;     } } 
like image 142
Rob Meeuwisse Avatar answered Oct 15 '22 06:10

Rob Meeuwisse