Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/211.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Android 首选项活动:将值另存为整数_Android_Sharedpreferences_Preferenceactivity - Fatal编程技术网

Android 首选项活动:将值另存为整数

Android 首选项活动:将值另存为整数,android,sharedpreferences,preferenceactivity,Android,Sharedpreferences,Preferenceactivity,在我的首选项活动中使用简单的EditTextPreference: <EditTextPreference android:key="SomeKey" android:title="@string/some_title" android:summary="..." android:numeric="integer" android:maxLength="2" /> 向我抛出java.lang.ClassCastException:java.l

在我的首选项活动中使用简单的
EditTextPreference

<EditTextPreference
    android:key="SomeKey"
    android:title="@string/some_title"
    android:summary="..."
    android:numeric="integer"
    android:maxLength="2"
/>
向我抛出
java.lang.ClassCastException:java.lang.String
,并:

SharedPreferences preferences = PreferenceManager.getDefaultSharedPreferences(this);
String value = preferences.getString("SomeKey", "-1");
成功检索该值


如何使
首选项活动
在默认情况下将值另存为整数?

即使您设置了android:numeric=“integer”它也将是文本首选项-顾名思义。您可以使用Integer.valueOf()轻松地将字符串值转换为int。您还可以覆盖PreferenceActivity,以便在退出时自动进行转换


我认为最好的解决方案是编写简单的方法从首选项中获取该值。比如:

public static int getSomePref(Context context) {
    SharedPreferences prefs =
        PreferenceManager.getDefaultSharedPreferences(context);
    String value = prefs.getString("SomeKey", null);
    return value == null ? -1 : Integer.valueOf(value);
}

然后您就可以很容易地从代码中使用它。

您可以扩展EditTextPreference:

public class IntEditTextPreference extends EditTextPreference {

    public IntEditTextPreference(Context context) {
        super(context);
    }

    public IntEditTextPreference(Context context, AttributeSet attrs) {
        super(context, attrs);
    }

    public IntEditTextPreference(Context context, AttributeSet attrs, int defStyle) {
        super(context, attrs, defStyle);
    }

    @Override
    protected String getPersistedString(String defaultReturnValue) {
        return String.valueOf(getPersistedInt(-1));
    }

    @Override
    protected boolean persistString(String value) {
        return persistInt(Integer.valueOf(value));
    }
}
覆盖onSetInitialValue()和setText()方法会更好,但是您必须从基类复制一些代码。上面的解决方案更简单,但相当棘手——“string”方法对int进行处理。尽量不要进一步扩展此类;-)

您可以通过以下方式从XML使用它:

<package.name.IntEditTextPreference
    android:key="SomeKey"
    android:title="@string/some_title"
    android:summary="..."
    android:numeric="integer"
    android:maxLength="2"
/>

我也有同样的问题。(我想让SharedReference给我一个端口号,作为默认值存储在首选项xml文件中)

实现所有SharedReferences方法需要付出很大的努力,因此我认为在引用SharedReferences的类中编写一个自定义方法是最好的

您也可以在需要整型的行中使用整型的静态方法:

int number = Integer.valueOf(settings.getString("myNumberString", "0"));

尽管答案已经被接受,但我想分享一个更简短的方法来实现这一点:

SharedPreferences preferences = PreferenceManager.getDefaultSharedPreferences(this);
int value = Integer.parseInt(preferences.getString("SomeKey", "-1"));
由于您已经设置了只能输入数字,因此不会出现任何异常。 要完成我的回答:

<EditTextPref
    android:key="SomeKey"
    android:title="@string/some_title"
    android:summary="..."
    android:numeric="integer"
    android:maxLength="2" />

我想这是我能想到的最短的一个:

int CheckInterval = Integer.parseInt(sharedPreferences.getString("check_frequency","60"));

我知道这是一个老生常谈的问题,已经有了一个公认的答案,但我认为我的解决方案对寻找更完整答案的人会有所帮助。我刚刚改进了@broot answer,我的解决方案如下:

重写EditTextPreference以提供文本到整数的转换:

公共类IntEditTextPreference扩展EditTextPreference实现EditTextPreference.OnBindEditTextListener{
私有字符串多行文字;
公共IntEditTextPreference(上下文上下文、属性集属性、int-defStyleAttr、int-defStyleRes){
super(context、attrs、defStyleAttr、defStyleRes);
setOnBindEditTextListener(此);
}
公共IntEditTextPreference(上下文上下文、属性集属性、int defStyleAttr){
super(上下文、attrs、defStyleAttr);
setOnBindEditTextListener(此);
}
公共IntEditTextPreference(上下文、属性集属性){
超级(上下文,attrs);
setOnBindEditTextListener(此);
}
公共IntEditTextPreference(上下文){
超级(上下文);
setOnBindEditTextListener(此);
}
/**
*将文本保存到当前数据存储器中。
*
*@param text要保存的文本
*/
公共void setText(字符串文本){
最后一个布尔值wasBlocking=shouldDisableDependents();
多行文字=文本;
int value=Integer.parseInt(文本);
persistin(值);
最终布尔值isBlocking=shouldDisableDependents();
if(isBlocking!=wasBlocking){
notifyDependencyChange(isBlocking);
}
notifyChanged();
}
/**
*从当前数据存储中获取文本。
*
*@返回当前首选项值
*/
公共字符串getText(){
返回多行文字;
}
@凌驾
受保护的void onSetInitialValue(对象默认值){
int值;
如果(默认值!=null){
字符串strDefaultValue=(字符串)defaultValue;
int defaultIntValue=Integer.parseInt(strDefaultValue);
值=getPersistedInt(defaultIntValue);
}否则{
值=getPersistedInt(0);
}
setText(Integer.toString(value));
}
@凌驾
公共布尔值shouldDisableDependents(){
返回TextUtils.isEmpty(mText)| | super.shouldDisableDependents();
}
@凌驾
public void onBindEditText(@NonNull EditText EditText){
editText.setInputType(InputType.TYPE\类别\编号);
}
}
在首选项xml中:


注意:不要使用android:numeric或android:inputType。由于EditTextPreference本身不是EditText,因此设置这些属性不会起任何作用。为了从EditTextPreference打开的对话框中获得所需的EditText效果,只需通过实现
EditTextPreference.OnBindEditTextListener
在自定义EditTextPreference中设置输入类型,正如您在上面的代码中所看到的那样


这就是我的工作原理。

我在哪里可以覆盖它?默认情况下,
PreferenceActivity
会自动保存,我应该重写某些获取值的方法还是自己保存所有值?好的,更改首选项类型不好,因为您可能会遇到ClassCastException问题。我更新了我的答案。是的,我自己也考虑过包装器,但我还是不喜欢这个解决方案
SharedReferences
已经有了
getInt
方法,所以仍然希望找到一种方法告诉
PreferenceActivity
如何将值保存为int-所有功能都在那里。。。只是没有那么好用……你可以自己编写偏好类。OP已经询问如何将值保存为整数。这个答案并没有解决这个问题,它只是提供了一种解决方法,可以在保存字符串的同时返回一个整数。@Brutall,我想通过改进代码向您表示感谢。但是有人对我说新的密码是。。。太久了,他拒绝了。哦,但是如果旧代码不好,需要替换,人们会怎么做,但是他们不会这样做,因为
int CheckInterval = Integer.parseInt(sharedPreferences.getString("check_frequency","60"));