我为自己的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();
}
}
}
答案 0 :(得分:1)
这是一个很老的问题,但是为了将来的读者,我会给出一个答案。
像您在此处所做的那样,从字符串转换是一种很好的方法。最终,DialogPreference
将会这样做。 XML中的属性是一个字符串,因此无论您将其转换还是为您转换,数据都将来自已解析的字符串。只要确保进行转换时,您就可以正确处理无效数据/ NumberFormatExceptions
。