优先创建 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 对话框的主要内容,如果未能解决你的问题,请参考以下文章

Android日期对话框NumberPicker的用法教程

在使用 TimePicker 或 NumberPicker 查看对话框首选项时旋转 Android 设备会导致应用程序崩溃

安卓 如何在点击一个按钮弹出的对话框中加入NumberPicker 并且将它的值显示在屏幕上

如何创建数字选择器对话框?

如何用动画改变 NumberPicker 的值?

带Spinner的Android Studio对话框[关闭]