2013-07-07 1 views
8

Я пытаюсь создать диалог NumberPicker на моем экране предпочтений. Я уже сделал один вслед за этим: https://stackoverflow.com/a/5533295/2442638Создать диалоговое окно NumberPicker в предпочтении

Однако, для моего второго диалога, я хочу только одну блесну, так что я адаптировал код следующим образом:

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

} 

Там нет ошибок и появляется диалоговое окно но макет его, кажется, «перепутался» :-). Синяя линия растягивается по всему диалоговому окну, а не только по ширине чисел. enter image description here

Вопрос в том, как правильно установить раскладку? (Я уверен, что есть много других ошибок, как хорошо!)

Спасибо

+0

может помочь вам https://gist.github.com/tomstrummer/959884 –

+0

@RSenApps Спасибо, я попробовал это, но я не мог заставить его работать :-( – RiThBo

ответ

5
+0

Это отличный ответ. – toobsco42

+2

Стилируемый здесь: https://github.com/CyanogenMod/android_packages_apps_Trebuchet/blob/cm-10.2/res/values/attrs.xml – Gh61

+5

Этот класс, как представляется, ссылается на 'com.android.internal' пакет. Мне нужно создать «original-android.jar», как описано [здесь] (http://bit.ly/1fimVuv), чтобы использовать его, или я слишком усложняю это? –

1

Это больше, чем обходной путь решения, но я надеюсь, что это помогает. Добавление фиктивного textView решило проблему. У меня точно такая же проблема.

Мой XML-файл:

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

и

android:text="@string/textDummyEmpty" 

является пустая строка. Возможно, его также достаточно, чтобы использовать только представление вместо textView.

+0

Спасибо за ваш ответ. В конце я использовал другой метод для его создания - это был открытый исходный код. Я не могу попробовать то, что вы предложили на данный момент, но я постараюсь сделать это скоро :-) – RiThBo

+1

@RiThBo, пожалуйста, поделитесь тем, как вы решили проблему, чтобы другие пользователи могли это сделать. – Richard

+1

@ Richard Я использовал CyanogenMod один. Где-то на GitHub я искал точный файл, но я больше не могу его найти. Извините – RiThBo

1

Вернуть LinearLayout в onCreateDialogView, а не NumberPicker, как показано ниже:

@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 е является примером простой, но работающий NumberPickerPreference, спасая целое значение в диапазоне от 1 до 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); 
    } 
} 

 Смежные вопросы

  • Нет связанных вопросов^_^