gpt4 book ai didi

android - 处理自定义首选项的长值

转载 作者:太空狗 更新时间:2023-10-29 14:12:13 26 4
gpt4 key购买 nike

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

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

我在这里给你留下代码 fragment ,你可以在你的项目中随意使用它,它没有使用 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();
}
}
}

最佳答案

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

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

关于android - 处理自定义首选项的长值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26532403/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com