代码之家  ›  专栏  ›  技术社区  ›  Laimoncijus

PreferenceActivity:将值另存为整数

  •  49
  • Laimoncijus  · 技术社区  · 15 年前

    EditTextPreference 在我的首选项活动中:

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

    有没有办法将此配置值保存为整数?现在似乎只允许输入数字,但值仍保存为字符串:

    打电话:

    SharedPreferences preferences = PreferenceManager.getDefaultSharedPreferences(this);
    int value = preferences.getInt("SomeKey", -1);
    

    把我扔了 java.lang.ClassCastException: java.lang.String ,以及:

    SharedPreferences preferences = PreferenceManager.getDefaultSharedPreferences(this);
    String value = preferences.getString("SomeKey", "-1");
    

    PreferenceActivity 是否将值默认保存为整数?

    5 回复  |  直到 15 年前
        1
  •  71
  •   Brian    11 年前

    您可以扩展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做了一些处理。尽量不要扩展这个类;-)

    <package.name.IntEditTextPreference
        android:key="SomeKey"
        android:title="@string/some_title"
        android:summary="..."
        android:numeric="integer"
        android:maxLength="2"
    />
    
        2
  •  6
  •   broot    15 年前

    即使你设定了android:数字=“integer”是文本首选项-顾名思义。您可以使用整数值().


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

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

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

        3
  •  3
  •   Arnab Jain    10 年前

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

    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" />
    
        4
  •  0
  •   Community Mohan Dere    9 年前

    我也有同样的问题。(我想让SharedReference给我一个端口号,作为defaultValue存储在PreferencesXML文件中)。

    实现所有的SharedPreferences方法需要很大的努力,因此在实例化SharedPreferences的类中编写一个自定义方法,如 broot 我想最好的建议是。

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

    int number = Integer.valueOf(settings.getString("myNumberString", "0"));
    
        5
  •  0
  •   Jadeye    7 年前

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

    int CheckInterval = Integer.parseInt(sharedPreferences.getString("check_frequency","60"));
    
        6
  •  0
  •   Iogui    5 年前

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

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

    public class IntEditTextPreference extends EditTextPreference implements EditTextPreference.OnBindEditTextListener {
        private String mText;
        
        public IntEditTextPreference(Context context, AttributeSet attrs, int defStyleAttr, int defStyleRes) {
            super(context, attrs, defStyleAttr, defStyleRes);
            setOnBindEditTextListener(this);
        }
    
        public IntEditTextPreference(Context context, AttributeSet attrs, int defStyleAttr) {
            super(context, attrs, defStyleAttr);
            setOnBindEditTextListener(this);
        }
    
        public IntEditTextPreference(Context context, AttributeSet attrs) {
            super(context, attrs);
            setOnBindEditTextListener(this);
        }
    
        public IntEditTextPreference(Context context) {
            super(context);
            setOnBindEditTextListener(this);
        }
    
        /**
         * Saves the text to the current data storage.
         *
         * @param text The text to save
         */
        public void setText(String text) {
            final boolean wasBlocking = shouldDisableDependents();
    
            mText = text;
    
            int value = Integer.parseInt(text);
    
            persistInt(value);
    
            final boolean isBlocking = shouldDisableDependents();
            if (isBlocking != wasBlocking) {
                notifyDependencyChange(isBlocking);
            }
    
            notifyChanged();
        }
    
        /**
         * Gets the text from the current data storage.
         *
         * @return The current preference value
         */
        public String getText() {
            return mText;
        }
    
        @Override
        protected void onSetInitialValue(Object defaultValue) {
            int value;
            if (defaultValue != null) {
                String strDefaultValue = (String) defaultValue;
    
                int defaultIntValue = Integer.parseInt(strDefaultValue);
                value = getPersistedInt(defaultIntValue);
            } else {
                value = getPersistedInt(0);
            }
    
            setText(Integer.toString(value));
        }
    
        @Override
        public boolean shouldDisableDependents() {
            return TextUtils.isEmpty(mText) || super.shouldDisableDependents();
        }
    
        @Override
        public void onBindEditText(@NonNull EditText editText) {
            editText.setInputType(InputType.TYPE_CLASS_NUMBER);
        }
    }
    

    在首选项xml中:

    <your.package.here.IntEditTextPreference
                android:key="some_key"
                android:title="@string/some_title"
                android:defaultValue="5"
                app:useSimpleSummaryProvider="true"/>
    

    注意:不要使用android:数字nor安卓:输入类型。由于EditTextPreference不是EditText本身,因此设置这些属性将不起任何作用。为了从EditTextPreference打开的对话框中获得所需的EditText效果,只需通过实现在自定义EditTextPreference中设置输入类型 EditTextPreference.OnBindEditTextListener

    对我来说就是这样。