简体   繁体   中英

For entry and entryValues, can one mix string and integer arrays in ListPreference?

Can one do this for a ListPreference? (target API 19)

<string-array name="alert_type">
    <item>regular intervals</item>
    <item>one time</item>
</string-array>
<integer-array name="alert_type_value">
    <item>0</item>
    <item>1</item>
</integer-array>

I am getting this error. when I change the integer-array to a string-array, then I do not get the error below.

05-10 20:54:52.179: W/dalvikvm(32634): threadid=1: thread exiting with uncaught exception (group=0x40bef1f8)
05-10 20:54:52.209: E/AndroidRuntime(32634): FATAL EXCEPTION: main
05-10 20:54:52.209: E/AndroidRuntime(32634): java.lang.NullPointerException
05-10 20:54:52.209: E/AndroidRuntime(32634):    at android.preference.ListPreference.findIndexOfValue(ListPreference.java:215)
05-10 20:54:52.209: E/AndroidRuntime(32634):    at android.preference.ListPreference.getValueIndex(ListPreference.java:224)
05-10 20:54:52.209: E/AndroidRuntime(32634):    at android.preference.ListPreference.getEntry(ListPreference.java:202)
05-10 20:54:52.209: E/AndroidRuntime(32634):    at android.preference.ListPreference.getSummary(ListPreference.java:148)
05-10 20:54:52.209: E/AndroidRuntime(32634):    at android.preference.Preference.onBindView(Preference.java:507)
05-10 20:54:52.209: E/AndroidRuntime(32634):    at android.preference.Preference.getView(Preference.java:453)
05-10 20:54:52.209: E/AndroidRuntime(32634):    at android.preference.PreferenceGroupAdapter.getView(PreferenceGroupAdapter.java:222)
05-10 20:54:52.209: E/AndroidRuntime(32634):    at android.widget.AbsListView.obtainView(AbsListView.java:2222)
05-10 20:54:52.209: E/AndroidRuntime(32634):    at android.widget.ListView.makeAndAddView(ListView.java:1774)
05-10 20:54:52.209: E/AndroidRuntime(32634):    at android.widget.ListView.fillDown(ListView.java:672)
05-10 20:54:52.209: E/AndroidRuntime(32634):    at android.widget.ListView.fillFromTop(ListView.java:732)
05-10 20:54:52.209: E/AndroidRuntime(32634):    at android.widget.ListView.layoutChildren(ListView.java:1611)
05-10 20:54:52.209: E/AndroidRuntime(32634):    at android.widget.AbsListView.onLayout(AbsListView.java:2052)
05-10 20:54:52.209: E/AndroidRuntime(32634):    at android.view.View.layout(View.java:11484)
05-10 20:54:52.209: E/AndroidRuntime(32634):    at android.view.ViewGroup.layout(ViewGroup.java:4229)
05-10 20:54:52.209: E/AndroidRuntime(32634):    at android.widget.LinearLayout.setChildFrame(LinearLayout.java:1644)
05-10 20:54:52.209: E/AndroidRuntime(32634):    at android.widget.LinearLayout.layoutVertical(LinearLayout.java:1502)
05-10 20:54:52.209: E/AndroidRuntime(32634):    at android.widget.LinearLayout.onLayout(LinearLayout.java:1415)
05-10 20:54:52.209: E/AndroidRuntime(32634):    at android.view.View.layout(View.java:11484)
05-10 20:54:52.209: E/AndroidRuntime(32634):    at android.view.ViewGroup.layout(ViewGroup.java:4229)
05-10 20:54:52.209: E/AndroidRuntime(32634):    at android.widget.FrameLayout.onLayout(FrameLayout.java:431)
05-10 20:54:52.209: E/AndroidRuntime(32634):    at android.view.View.layout(View.java:11484)
05-10 20:54:52.209: E/AndroidRuntime(32634):    at android.view.ViewGroup.layout(ViewGroup.java:4229)
05-10 20:54:52.209: E/AndroidRuntime(32634):    at android.widget.LinearLayout.setChildFrame(LinearLayout.java:1644)
05-10 20:54:52.209: E/AndroidRuntime(32634):    at android.widget.LinearLayout.layoutVertical(LinearLayout.java:1502)
05-10 20:54:52.209: E/AndroidRuntime(32634):    at android.widget.LinearLayout.onLayout(LinearLayout.java:1415)
05-10 20:54:52.209: E/AndroidRuntime(32634):    at android.view.View.layout(View.java:11484)
05-10 20:54:52.209: E/AndroidRuntime(32634):    at android.view.ViewGroup.layout(ViewGroup.java:4229)
05-10 20:54:52.209: E/AndroidRuntime(32634):    at android.widget.FrameLayout.onLayout(FrameLayout.java:431)
05-10 20:54:52.209: E/AndroidRuntime(32634):    at android.view.View.layout(View.java:11484)
05-10 20:54:52.209: E/AndroidRuntime(32634):    at android.view.ViewGroup.layout(ViewGroup.java:4229)
05-10 20:54:52.209: E/AndroidRuntime(32634):    at android.view.ViewRootImpl.performTraversals(ViewRootImpl.java:1671)
05-10 20:54:52.209: E/AndroidRuntime(32634):    at android.view.ViewRootImpl.handleMessage(ViewRootImpl.java:2628)
05-10 20:54:52.209: E/AndroidRuntime(32634):    at android.os.Handler.dispatchMessage(Handler.java:99)
05-10 20:54:52.209: E/AndroidRuntime(32634):    at android.os.Looper.loop(Looper.java:137)
05-10 20:54:52.209: E/AndroidRuntime(32634):    at android.app.ActivityThread.main(ActivityThread.java:4511)
05-10 20:54:52.209: E/AndroidRuntime(32634):    at java.lang.reflect.Method.invokeNative(Native Method)
05-10 20:54:52.209: E/AndroidRuntime(32634):    at java.lang.reflect.Method.invoke(Method.java:511)
05-10 20:54:52.209: E/AndroidRuntime(32634):    at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:976)
05-10 20:54:52.209: E/AndroidRuntime(32634):    at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:743)
05-10 20:54:52.209: E/AndroidRuntime(32634):    at dalvik.system.NativeStart.main(Native Method)

Unfortunately you cannot do this with the normal ListPreference . However, this blog post shows how to make your own custom list preference that will accept an integer array, and there's even full source code at the end.

The simplest way for me was to translate from string to integer and back in the listeners.

from string to int

intValue = Integer.parseInt(sharedPreferences.getString(ALERT_TYPE,"-1"));
alertTypePreference.setSummary(intValue == -1 ? "click to set" : (intValue == AlertTable.PERIODIC_TYPE ? "regular intervals" : "one time"));

and back

    alertTypePreference.setOnPreferenceChangeListener(new OnPreferenceChangeListener() {
    @Override
    public boolean onPreferenceChange(Preference preference, Object newValue) {
        if (newValue.equals(Integer.toString(AlertTable.PERIODIC_TYPE))) {
            setEnabledAlertType(AlertTable.PERIODIC_TYPE);
        } else .....
        return true; 
    }
});

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM