【发布时间】: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();
}
}
}
【问题讨论】:
-
我正在查看文档,我在 Sharedpreferences developer.android.com/reference/android/content/… 上看到了一个 getLong() 方法@
-
@jucas 但是
TypedArray里面没有developer.android.com/reference/android/content/res/…
标签: android sharedpreferences long-integer android-preferences