处理自定义首选项的长值

时间:2014-10-23 16:06:35

标签: android sharedpreferences long-integer android-preferences

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

您可以在long上存储SharedPreferences个值,但getLong()上的任何TypedArray都不会用来访问Android上的属性值。因此,我所做的解决方法是将TypedArray中的值设为String并将其转换为long。但我想知道是否有更好的方法

在这里,我给您留下代码片段,随意在您的项目中使用它,它不使用NumberPicker小部件,它是用TextView和2构建的按钮,以便您可以在旧设备上使用它。

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

1 个答案:

答案 0 :(得分:1)

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

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