【问题标题】:Handling long values on custom preferences处理自定义首选项的长值
【发布时间】:2014-10-23 16:06:35
【问题描述】:

我为我的 Android 应用创建了一个自定义 Preference,确切地说是一个数字选择器偏好。很遗憾,Android 还没有提供内置的偏好,但我们需要处理它,所以我创建了一个,因为我可以在未来的项目中重用该代码,所以我决定使用 @987654324 @values,所以它可以处理非常大的数字,但我发现了一些非常奇怪的东西。

您可以将long 值存储在SharedPreferences 上,但TypedArray 上没有任何getLong() 用于访问Android 上的属性值。所以我所做的解决方法是从TypedArray 获取值作为Strings 并将它们转换为long。但我想知道是否有更好的方法

这里我把代码 sn-p 留给你,你可以随意在你的项目中使用它,它不是使用 NumberPicker 小部件,它是用一个 TextView 和两个按钮构建的,因此你可以在旧设备上使用它。

public class NumberPickerPreference extends DialogPreference {

    private long max;
    private long min;
    private long value;
    private TextView picker;
    private Button btnUp;
    private Button btnDown;
    private int step;
    private long defValue;

    public NumberPickerPreference(Context context, AttributeSet attrs) {
        super(context, attrs);
        setPersistent(false);
        setDialogLayoutResource(R.layout.number_picker);
        setPositiveButtonText(android.R.string.ok);
        setNegativeButtonText(R.string.cancel);
        TypedArray numberPickerType=context.obtainStyledAttributes(attrs, 
                R.styleable.NumberPickerPreference, 0, 0);
        String maxStr = numberPickerType.getString(R.styleable.NumberPickerPreference_max);
        if(maxStr==null) {
            maxStr="50";
        }
        String minStr=numberPickerType.getString(R.styleable.NumberPickerPreference_min);
        if(minStr==null) {
            minStr="5";
        }
        step=numberPickerType.getInt(R.styleable.NumberPickerPreference_step, 1);
        max=Long.parseLong(maxStr);
        min=Long.parseLong(minStr);             
        numberPickerType.recycle();
    }

    @Override
    protected void onBindDialogView(View v) {
        picker=(TextView)v.findViewById(R.id.tvNumUpDown);
        btnUp=(Button)v.findViewById(R.id.btnUp);
        btnDown=(Button)v.findViewById(R.id.btnDown);
        btnUp.setOnClickListener(new View.OnClickListener() {

            @Override
            public void onClick(View v) {
                add();              
            }
        });
        btnDown.setOnClickListener(new View.OnClickListener() {

            @Override
            public void onClick(View v) {
                subs();
            }
        });     
        value=getSharedPreferences().getLong(getKey(), defValue);
        picker.setText(value+"");
        super.onBindDialogView(v);
    }

    @Override
    protected void onSetInitialValue(boolean restorePersistedValue,
            Object defaultValue) {
        long aux=min;
        if(defaultValue!=null && !defaultValue.toString().isEmpty()) {
            aux=Long.parseLong(defaultValue.toString());
        }
        defValue=(restorePersistedValue?getPersistedLong(min):aux);
    }

    /**
     * You can provide a default value with the android:defaultValue attribute here
     */
    @Override
    protected Object onGetDefaultValue(TypedArray a, int index) {
        return a.getString(index);
    }

    protected void subs() {
        if(value>min) {
            value-=step;
            picker.setText(value+"");
        }
    }



    protected void add() {
        if(value<max) {
            value+=step;
            picker.setText(value+"");
        }
    }

    @Override
    protected void onDialogClosed(boolean positiveResult) {
        if(positiveResult) {
            getEditor().putLong(getKey(), value).commit();
        }
    }
}

【问题讨论】:

标签: android sharedpreferences long-integer android-preferences


【解决方案1】:

这是一个相当老的问题,但为了未来的读者,我会给出一个答案。

像您在此处所做的那样从字符串转换是一种很好的方法。最终,这就是DialogPreference 无论如何都会做的事情。 XML 中的属性是一个字符串,因此无论您转换它,还是为您转换它,数据都将来自已解析的字符串。只需确保在进行转换时正确处理无效数据/NumberFormatExceptions

【讨论】:

  • 你完全正确。我完全错过了 NumberFormatException。感谢您指出这一点
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-09-05
  • 1970-01-01
  • 2011-04-03
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多