2013-07-07 3 views
8

Ich versuche, ein NumberPicker-Dialogfeld in meinem Einstellungsbildschirm zu erstellen. Ich habe bereits eine im Anschluss an diese: https://stackoverflow.com/a/5533295/2442638Erstellen Sie das NumberPicker-Dialogfeld in der Präferenz

jedoch für meine zweite Dialog, ich möchte nur ein Spinner, so habe ich den Code wie folgt angepasst:

import android.content.Context; 
import android.content.SharedPreferences; 
import android.content.res.TypedArray; 
import android.preference.DialogPreference; 
import android.util.AttributeSet; 
import android.view.View; 
import android.widget.NumberPicker; 

public class SnoozeTPP extends DialogPreference { 

    private int Minute = 0; 
    private NumberPicker np= null; 

    public static int getMinute(String time) { 
     String[] pieces = time.split(":"); 

     return (Integer.parseInt(pieces[1])); 
    } 

    public SnoozeTPP(Context context, AttributeSet attrs) { 
     super(context, attrs); 

     setPositiveButtonText("Set"); 
     setNegativeButtonText("Cancel"); 
    } 

    @Override 
    protected View onCreateDialogView() { 
     np = new NumberPicker(getContext()); 

     return (np); 
    } 

    @Override 
    protected void onBindDialogView(View v) { 
     super.onBindDialogView(v); 

     np.setMaxValue(60); 
     np.setValue(Minute); 
    } 

    @Override 
    protected void onDialogClosed(boolean positiveResult) {                
     super.onDialogClosed(positiveResult); 

     if (positiveResult) { 

      Minute = np.getValue(); 

      String time = 0 + ":" + String.valueOf(Minute); 

      if (callChangeListener(time)) { 
       persistString(time); 
      } 
     } 
    } 

    @Override 
    protected Object onGetDefaultValue(TypedArray a, int index) { 
     return (a.getString(index)); 
    } 

    @Override 
    protected void onSetInitialValue(boolean restoreValue, Object defaultValue) { 
     String time = null; 

     if (restoreValue) { 
      if (defaultValue == null) { 
       time = getPersistedString("08:00"); 
      } else { 
       time = getPersistedString(defaultValue.toString()); 
      } 
     } else { 
      time = defaultValue.toString(); 
     } 

     Minute = getMinute(time); 
    } 

} 

Es sind keine Fehler und die Dialog Pops richtig auf, aber das Layout scheint "durcheinander" zu sein :-). Die blaue Linie erstreckt sich über den gesamten Dialog und nicht nur über die Breite der Zahlen. enter image description here

Die Frage ist - wie man das Layout richtig einstellt? (Ich bin sicher, es gibt viele andere Fehler, wie gut!)

Danke

+0

Ihnen helfen können https://gist.github.com/tomstrummer/959884 –

+0

@RSenApps Danke, ich habe es versucht, aber ich konnte es nicht zur Arbeit bringen :-( – RiThBo

Antwort

5
+0

Dies ist eine gute Antwort – toobsco42

+2

Styleable ist hier: https://github.com/CyanogenMod/android_packages_apps_Trebuchet/blob/cm-10.2/res/values/attrs.xml – Gh61

+5

Diese Klasse scheint die 'com.android.internal' zu verweisen Paket. Muss ich ein 'original-android.jar' wie beschrieben [hier] (http://bit.ly/1fimVuv) erstellen, um es zu benutzen, oder verkompliziere ich das zu sehr? –

1

Dies ist mehr ein Problem zu umgehen als eine Lösung, aber ich hoffe, es hilft. Das Hinzufügen eines Dummy-TextView löste das Problem. Ich habe genau das gleiche Problem.

Meine XML-Datei:

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" 
    android:layout_width="wrap_content" 
    android:layout_height="wrap_content" 
    android:orientation="vertical" > 

    <TextView 
     android:id="@+id/textDummyEmpty" 
     android:layout_width="wrap_content" 
     android:layout_height="wrap_content" 
     android:text="@string/textDummyEmpty" /> 

    <NumberPicker 
     android:id="@+id/numberPicker1" 
     android:layout_width="wrap_content" 
     android:layout_height="wrap_content" 
     android:layout_gravity="center_horizontal" /> 

</LinearLayout> 

und

android:text="@string/textDummyEmpty" 

ist ein leerer String. Vielleicht ist es auch genug, nur eine Ansicht anstelle einer Textansicht zu verwenden.

+0

Danke für deine Antwort. Am Ende verwendete ich eine andere Methode, um es zu erstellen - es war Open-Source-Code. Ich bin nicht in der Lage zu versuchen, was Sie im Moment vorgeschlagen - aber ich werde versuchen, so bald zu tun :-) – RiThBo

+1

@RiThBo teilen Sie bitte, wie Sie das Problem gelöst, damit andere Benutzer es auch tun können. – Richard

+1

@Richard Ich habe das CyanogenMod verwendet. Irgendwo auf GitHub, habe ich nach der genauen Datei gesucht, aber ich kann sie nicht mehr finden. Sorry – RiThBo

1

Rückkehr ein Linearlayout in onCreateDialogView statt Number wie folgt:

@Override 
protected View onCreateDialogView() { 
    numberPicker = new NumberPicker(getContext()); 
    numberPicker.setMinValue(1); 
    numberPicker.setMaxValue(12); 
    numberPicker.setWrapSelectorWheel(false); 
    numberPicker.setValue(lastValue); 

    LinearLayout.LayoutParams pickerParams = new LinearLayout.LayoutParams 
      (LayoutParams.WRAP_CONTENT, LayoutParams.WRAP_CONTENT); 
    pickerParams.gravity = Gravity.CENTER; 
    numberPicker.setLayoutParams(pickerParams); 

    LinearLayout layout = new LinearLayout(getContext()); 
    LinearLayout.LayoutParams params = new LinearLayout.LayoutParams 
      (LayoutParams.MATCH_PARENT, LayoutParams.WRAP_CONTENT); 
    layout.setOrientation(LinearLayout.VERTICAL); 
    layout.setLayoutParams(params); 

    layout.addView(numberPicker); 
    return layout; 

    //return numberPicker; 
} 
3

Her e ist ein Beispiel für einfache, aber arbeiten NumberPickerPreference, ganzzahligen Wert sparend zwischen 1 und 100:

app screenshot

NumberPickerPreference.java:

public class NumberPickerPreference extends DialogPreference { 
    private NumberPicker mPicker; 
    private Integer mNumber = 0; 

    public NumberPickerPreference(Context context, AttributeSet attrs) { 
     this(context, attrs, 0); 
    } 

    public NumberPickerPreference(Context context, AttributeSet attrs, int defStyle) { 
     super(context, attrs, defStyle); 
     setPositiveButtonText(android.R.string.ok); 
     setNegativeButtonText(android.R.string.cancel); 
    } 

    @Override 
    protected View onCreateDialogView() { 
     mPicker = new NumberPicker(getContext()); 
     mPicker.setMinValue(1); 
     mPicker.setMaxValue(100); 
     mPicker.setValue(mNumber); 
     return mPicker; 
    } 

    @Override 
    protected void onDialogClosed(boolean positiveResult) { 
     if (positiveResult) { 
      // needed when user edits the text field and clicks OK 
      mPicker.clearFocus(); 
      setValue(mPicker.getValue()); 
     } 
    } 

    @Override 
    protected void onSetInitialValue(boolean restoreValue, Object defaultValue) { 
     setValue(restoreValue ? getPersistedInt(mNumber) : (Integer) defaultValue); 
    } 

    public void setValue(int value) { 
     if (shouldPersist()) { 
      persistInt(value); 
     } 

     if (value != mNumber) { 
      mNumber = value; 
      notifyChanged(); 
     } 
    } 

    @Override 
    protected Object onGetDefaultValue(TypedArray a, int index) { 
     return a.getInt(index, 0); 
    } 
} 
Verwandte Themen