优先创建 NumberPicker 对话框
Posted
技术标签:
【中文标题】优先创建 NumberPicker 对话框【英文标题】:Create NumberPicker dialog in preference 【发布时间】:2013-07-05 02:27:04 【问题描述】:我正在尝试在我的首选项屏幕中创建一个 NumberPicker 对话框。我已经做了一个这样的:https://***.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);
没有错误,对话框正确弹出,但它的布局似乎“搞砸了”:-)。蓝线横跨整个对话框,而不仅仅是数字的宽度。
问题是——如何正确设置布局? (我相信还有很多其他错误!)
谢谢
【问题讨论】:
可以帮到你gist.github.com/tomstrummer/959884 @RSenApps 谢谢,我确实尝试过,但我无法让它工作:-( 【参考方案1】:我使用 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
【讨论】:
这是一个很好的答案 Styleable 在这里:github.com/CyanogenMod/android_packages_apps_Trebuchet/blob/… 这个类似乎引用了com.android.internal
包。我是否需要按照here 的描述构建一个original-android.jar
才能使用它,还是我过于复杂了?【参考方案2】:
这是一个简单但有效的 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);
【讨论】:
【参考方案3】:这更像是一种解决方法而不是解决方案,但我希望它有所帮助。添加一个虚拟的 textView 解决了这个问题。我遇到了完全相同的问题。
我的 xml 文件:
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_
android:layout_
android:orientation="vertical" >
<TextView
android:id="@+id/textDummyEmpty"
android:layout_
android:layout_
android:text="@string/textDummyEmpty" />
<NumberPicker
android:id="@+id/numberPicker1"
android:layout_
android:layout_
android:layout_gravity="center_horizontal" />
</LinearLayout>
和
android:text="@string/textDummyEmpty"
是一个空字符串。也许只使用视图而不是 textView 也足够了。
【讨论】:
感谢您的回答。最后我使用了另一种方法来创建它——它是开源代码。我目前无法尝试您的建议 - 但我会尽快尝试:-) @RiThBo 请分享您是如何解决问题的,以便其他用户也可以这样做。 @Richard 我使用了 CyanogenMod 之一。它在 GitHub 上的某个地方,我查找了确切的文件,但我再也找不到它了。对不起 嘿@RiThBo,你是如何解决蓝线一直延伸到整个对话框的问题的? @toobsco42 我没有找到 GitHub 文件的链接,但我发布了一个包含大部分代码的答案。【参考方案4】:在 onCreateDialogView 中返回一个 LinearLayout 而不是 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;
【讨论】:
以上是关于优先创建 NumberPicker 对话框的主要内容,如果未能解决你的问题,请参考以下文章
在使用 TimePicker 或 NumberPicker 查看对话框首选项时旋转 Android 设备会导致应用程序崩溃