【问题标题】:My ListPreference does not persist values when changing screen orientation更改屏幕方向时,我的 ListPreference 不保留值
【发布时间】:2016-11-11 16:14:15
【问题描述】:

我已经坚持了几天并尝试了不同的解决方法。 当我更改屏幕方向时,首选项摘要失去了它的价值。

我有一个自定义 ListPreference,当用户单击它时,会弹出两个好友选项 - 我自己和其他人(在实际程序中,用户从联系人中选择好友)。

我将摘要设置为所选好友的电子邮件地址。

点击偏好会弹出列表偏好,根据点击的内容,显示我自己或联系人选择器以选择好友。

“我自己”被选中

翻手机会失去好友

这是一个工作程序被剥离以显示要点。

类 BuddyPreference2

public class BuddyPreference2 extends ListPreference {
    String buddy;
    private static final String TAG = "REGU";

    public BuddyPreference2(Context context, AttributeSet attrs) {
        super(context, attrs);
    }
    @Override
    protected void onDialogClosed(boolean positiveResult) {
        if (positiveResult) {
            persistString((String) buddy);
        }
        super.onDialogClosed(positiveResult);
    }
    @Override
    protected void onSetInitialValue(boolean restoreValue, Object defaultValue) {
        super.onSetInitialValue(restoreValue, defaultValue);
        if (restoreValue) {
            // Restore existing state
            buddy = this.getPersistedString("none set");
        } else {
            // Set default state from the XML attribute
            buddy = (String) defaultValue;
            persistString(buddy);
        }
    }
    /*
     * (non-Javadoc)
     * 
     * @see android.preference.ListPreference#setValue(java.lang.String)
     */
    @Override
    public void setValue(String value) {
        String s = new String(value);
        super.setValue(s);
    }
    @Override
    protected View onCreateDialogView() {
        View view = super.onCreateDialogView();

        return view;
    }
}

user_prefs.xml

<?xml version="1.0" encoding="utf-8"?>
<PreferenceScreen xmlns:android="http://schemas.android.com/apk/res/android"
    android:key="@+id/pref_screen" >
    <com.mypreferences.BuddyPreference2
        android:entries="@array/buddy_entry"
        android:entryValues="@array/buddy_value"
        android:key="buddy_entry"
        android:summary="my buddy"
        android:title="my buddy" />
</PreferenceScreen>

类 EditAlertPreferencesActivity

public class EditAlertPreferencesActivity extends Activity {


    static final String BUDDY = "buddy_entry";

    static final String TAG = "REGU";
    private static final int CONTACT_PICKER_RESULT = 1001;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.user_prefs_fragment);
    }

    // Fragment that displays the mesg preference
    public static class UserPreferenceFragment extends PreferenceFragment {

        protected static final String TAG = "REGU";
        private OnSharedPreferenceChangeListener mListener;
        private Preference buddyPreference;

        String myEmailAddress;

        String getMyEmailAddress() {
                    return "Myself" + " <me@my.com>";
        }

        public void setBuddySummary(String s) {
            buddyPreference.setSummary(s);
        }


        @Override
        public void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            myEmailAddress = getMyEmailAddress();

            // Load the preferences from an XML resource
            addPreferencesFromResource(R.xml.user_prefs);

            buddyPreference = (Preference) getPreferenceManager().findPreference(BUDDY);

            buddyPreference.setOnPreferenceChangeListener(new OnPreferenceChangeListener() {
                @Override
                public boolean onPreferenceChange(Preference preference, Object newValue) {
                    String buddyChoice = (String) newValue;
                    if (buddyChoice.equals(getString(R.string.select))) {
                        Toast.makeText(getActivity(), "pick a contact", Toast.LENGTH_SHORT);
                        pickContact();
                    } else {
                        buddyPreference.setSummary(myEmailAddress);
                    }
                    return false;
                }
            });

            // Attach a listener to update summary when msg changes
            mListener = new OnSharedPreferenceChangeListener() {
                @Override
                public void onSharedPreferenceChanged(SharedPreferences sharedPreferences,
                        String key) {
                    if (key.equals(BUDDY)) {
                        buddyPreference.setSummary(sharedPreferences.getString(BUDDY, "none set"));
                    } else {
                        Log.e(TAG, "error; I do not recognize key " + key);
                    }
                }
            };

            // Get SharedPreferences object managed by the PreferenceManager for
            // this Fragment
            SharedPreferences prefs = getPreferenceManager().getSharedPreferences();

            // Register a listener on the SharedPreferences object
            prefs.registerOnSharedPreferenceChangeListener(mListener);

            // Invoke callback manually to display the msg
            mListener.onSharedPreferenceChanged(prefs, BUDDY);
        }

        /*
         * (non-Javadoc)
         * 
         * @see android.preference.PreferenceFragment#onCreateView(android.view.
         * LayoutInflater, android.view.ViewGroup, android.os.Bundle)
         */
        @Override
        public View onCreateView(LayoutInflater inflater, ViewGroup container,
                Bundle savedInstanceState) {
            return super.onCreateView(inflater, container, savedInstanceState);
        }

        public void pickContact() {
                            String buddyEmailAddress = "Some Buddy " + " <buddy@email.com>";
                            setBuddySummary(buddyEmailAddress);
        }
    }
}

user_prefs_fragment.xml

<?xml version="1.0" encoding="utf-8"?>
<fragment xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    class="com.mypreferences.EditAlertPreferencesActivity$UserPreferenceFragment"
    android:orientation="vertical" 
    android:id="@+id/userPreferenceFragment">

</fragment>

数组.xml

<?xml version="1.0" encoding="utf-8"?>
<resources>
    <string-array name="buddy_entry">
        <item>myself</item>
        <item>select a contact</item>
    </string-array>
    <string-array name="buddy_value">
        <item>myself</item>
        <item>select</item>
    </string-array>
</resources>

类 PreferencesActivityExample

public class PreferencesActivityExample extends Activity {

    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);

        // Open a User Preferences Entry Activity 
        final Button button = (Button) findViewById(R.id.check_pref_button);
        button.setOnClickListener(new OnClickListener() {
            @Override
            public void onClick(View v) {
                startActivity(new Intent(
                        PreferencesActivityExample.this,
                        EditAlertPreferencesActivity.class));
            }
        });

    }
}

字符串.xml

<?xml version="1.0" encoding="utf-8"?>
<resources>
    <string name="select">select</string>
</resources>

【问题讨论】:

    标签: android android-fragments


    【解决方案1】:

    问题是对话框中选择的Preference 值未保存/更新。 您可以轻松验证此 Close the Activity and launch gain. You will still see the default value ,注意与 orientation 更改有关。

    FIX:您需要返回true 以更新preference 中的新值。

    @Override
    public boolean onPreferenceChange(Preference preference, Object newValue) {
        // do all your other stuff here            
        return true;
    }
    

    True 用新值更新 Preference 的状态。

    【讨论】:

    • 成功了!但我看到摘要设置为“已选择”,而不是我坚持的电子邮件地址。如果我保留电子邮件地址,我想知道为什么我会取回数组值“selected”。
    • 在 BuddyPreference2 中,我做了public void setSummary(CharSequence summary) { super.setSummary(summary); persistString((String) summary); },这很有效。与往常一样,我感谢您的乐于助人的态度!
    • 哇,谢谢你的提示。我从没想过它可能是返回值。 :D
    【解决方案2】:
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
    
        final ListPreference listPreferenceCategory = (ListPreference) findPreference("pref_list_category");
        listPreferenceCategory.setOnPreferenceChangeListener(new Preference.OnPreferenceChangeListener() {
            @Override
            public boolean onPreferenceChange(Preference preference, Object newValue) {
                String category = (String) newValue;
                CharSequence[] listEntries = listPreferenceCategory.getEntries();
                int indexValue = listPreferenceCategory.findIndexOfValue(category);
                listPreferenceCategory.setSummary(listEntries[indexValue]);
                return true;
            }
        });
    }
    

    在xml中:

     <ListPreference
            android:dialogTitle="@string/pref_category"
            android:entries="@array/categories"
            android:summary="@string/pref_category"
            android:entryValues="@array/categories_value"
            android:key="pref_list_category"
            android:title="@string/pref_category"/>
    

    这是我的工作代码。试试吧!

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-12-05
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多