首选创buildNumberPicker对话框

我正在尝试在我的首选项屏幕上创build一个NumberPicker对话框。 我已经做了一个如下: https : //stackoverflow.com/a/5533295/2442638

然而,对于我的第二个对话框,我只需要一个微调,所以我已经调整了代码如下:

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

没有错误,对话popup正确,但它的布局似乎是“搞砸”:-)。 蓝线横跨整个对话而不是数字的宽度。 在这里输入图像说明

问题是 – 如何正确设置布局? (我相信也有很多其他的错误!)

谢谢

Solutions Collecting From Web of "首选创buildNumberPicker对话框"

我通过使用CyanogenMod号码选取器解决了这个问题。 Java文件:

https://github.com/CyanogenMod/android_packages_apps_Trebuchet/blob/cm-10.2/src/com/cyanogenmod/trebuchet/preference/NumberPickerPreference.java

XML文件: https : //github.com/CyanogenMod/android_packages_apps_Trebuchet/blob/cm-10.2/res/layout/number_picker_dialog.xml

属性: https : //github.com/CyanogenMod/android_packages_apps_Trebuchet/blob/cm-10.2/res/values/attrs.xml#L158

下面是一个简单的例子,但是工作NumberPickerPreference,保存1到100之间的整数值:

应用截图

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

这是比解决scheme更多的解决方法,但我希望它有帮助。 添加一个虚拟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" 

是一个空string。 也许它也足以使用一个视图,而不是一个textView。

在onCreateDialogView而不是NumberPicker中返回一个LinearLayout,如下所示:

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