改变屏幕方向,当我的列表preference不会保留值 [英] My ListPreference does not persist values when changing screen orientation

查看:169
本文介绍了改变屏幕方向,当我的列表preference不会保留值的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我一直停留在这几天,尝试了不同的解决方法。
当我改变屏幕方向,preference总结失去了它的价值。

我有一个自定义列表preference,当用户点击,弹出两种选择好友 - 我自己,和其他一些(在实际的程序中,用户从通讯录中好友)

我设置了​​汇总到所选择的好友的电子邮件地址。

点击preference弹出列表preference这取决于被点击了什么,显示自己,或联系人选择器来选择好友。

我自己被选中

翻转手机失去好友

下面是剥离显示要领工作计划。

班好友preference2

 公共类好友preference2扩展列表$ P $ {pference
    字符串的好友;
    私有静态最后弦乐TAG =REGU;    公共好友preference2(上下文的背景下,ATTRS的AttributeSet){
        超(背景下,ATTRS);
    }
    @覆盖
    保护无效onDialogClosed(布尔positiveResult){
        如果(positiveResult){
            persistString((字符串)好友);
        }
        super.onDialogClosed(positiveResult);
    }
    @覆盖
    保护无效onSetInitialValue(布尔restoreValue,对象设置defaultValue){
        super.onSetInitialValue(restoreValue,设置defaultValue);
        如果(restoreValue){
            //恢复存在状态
            哥们= this.getPersistedString(无设定);
        }其他{
            从XML属性//设置默认状态
            哥们=(字符串)设置defaultValue;
            persistString(好友);
        }
    }
    / *
     *(非Javadoc中)
     *
     * @see机器人。preference.List $ P $#pference的setValue(java.lang.String中)
     * /
    @覆盖
    公共无效的setValue(字符串值){
        字符串s =新的String(值);
        super.setValue(多个);
    }
    @覆盖
    受保护的视图onCreateDialogView(){
        查看查看= super.onCreateDialogView();        返回视图。
    }
}

用户_ prefs.xml

 <?XML版本=1.0编码=UTF-8&GT?;
< preferenceScreen的xmlns:机器人=htt​​p://schemas.android.com/apk/res/android
    机器人:键=@ + ID / pref_screen>
    < com.my preferences.Buddy preference2
        机器人:项=@阵列/ buddy_entry
        机器人:entryValues​​ =@阵列/ buddy_value
        机器人:键=buddy_entry
        机器人:总结=我的好友
        机器人:标题=我的好友/>
< / preferenceScreen>

类EditAlert preferencesActivity

 公共类EditAlert preferencesActivity延伸活动{
    静态最后弦乐BUDDY =buddy_entry;    静态最后弦乐TAG =REGU;
    私有静态最终诠释CONTACT_PICKER_RESULT = 1001;    @覆盖
    保护无效的onCreate(捆绑savedInstanceState){
        super.onCreate(savedInstanceState);
        的setContentView(R.layout.user_ prefs_fragment);
    }    //片段显示的MESG preference
    公共静态类用户preferenceFragment扩展$ P $ {pferenceFragment        受保护的静态最后弦乐TAG =REGU;
        私人OnShared preferenceChangeListener mListener;
        私人preference好友preference;        串myEmailAddress;        串getMyEmailAddress(){
                    回到我+< me@my.com>;
        }        公共无效setBuddySummary(String s)将{
            好友preference.setSummary(S);
        }
        @覆盖
        公共无效的onCreate(捆绑savedInstanceState){
            super.onCreate(savedInstanceState);
            myEmailAddress = getMyEmailAddress();            //从XML资源负载的preferences
            加preferencesFromResource(R.xml.user_ preFS);            好友preference =(preference)获取preferenceManager()找到preference(BUDDY)。            好友preference.setOn preferenceChangeListener(新在preferenceChangeListener(){
                @覆盖
                在preferenceChange公共布尔(preference preference,对象为newValue){
                    字符串buddyChoice =(字符串类型)newValue;
                    如果(buddyChoice.equals(的getString(R.string.select))){
                        Toast.makeText(getActivity(),挑一个联系人,Toast.LENGTH_SHORT);
                        pickContact();
                    }其他{
                        好友preference.setSummary(myEmailAddress);
                    }
                    返回false;
                }
            });            //味精更改时附上一个监听器更新汇总
            mListener =新OnShared preferenceChangeListener(){
                @覆盖
                公共无效onShared preferenceChanged(共享preferences共享preferences,
                        字符串键){
                    如果(key.equals(BUD​​DY)){
                        好友preference.setSummary(共享preferences.getString(BUDDY,无设置));
                    }其他{
                        Log.e(TAG的错误,我不认识键+键);
                    }
                }
            };            //获取共享preferences对象由preferenceManager的管理
            //这个片段
            。共享preferences preFS = GET preferenceManager()getShared preferences();            //注册共享preferences对象上的监听
            prefs.registerOnShared preferenceChangeListener(mListener);            //手动调用回调函数来显示味精
            mListener.onShared preferenceChanged(preFS,BUDDY);
        }        / *
         *(非Javadoc中)
         *
         * @see机器人。preference。$ P $#pferenceFragment onCreateView(android.view。
         * LayoutInflater,android.view.ViewGroup,android.os.Bundle)
         * /
        @覆盖
        公共查看onCreateView(LayoutInflater充气器,容器的ViewGroup,
                捆绑savedInstanceState){
            返回super.onCreateView(充气器,容器,savedInstanceState);
        }        公共无效pickContact(){
                            字符串buddyEmailAddress =一些巴迪+< buddy@email.com>;
                            setBuddySummary(buddyEmailAddress);
        }
    }
}

用户_ prefs_fragment.xml

 <?XML版本=1.0编码=UTF-8&GT?;
<片段的xmlns:机器人=htt​​p://schemas.android.com/apk/res/android
    机器人:layout_width =match_parent
    机器人:layout_height =match_parent
    类=com.my preferences.EditAlert preferencesActivity $ USER preferenceFragment
    机器人:方向=垂直
    机器人:ID =@ + ID /用户preferenceFragment>&所述; /片断>

arrays.xml

 <?XML版本=1.0编码=UTF-8&GT?;
<资源>
    <字符串数组名=buddy_entry>
        <项目>&我LT; /项目>
        <项目>选择一个联系人< /项目>
    < /字符串数组>
    <字符串数组名=buddy_value>
        <项目>&我LT; /项目>
        <项目>选择< /项目>
    < /字符串数组>
< /资源>

类preferencesActivityExample

 公共类preferencesActivityExample延伸活动{    @覆盖
    公共无效的onCreate(捆绑savedInstanceState){
        super.onCreate(savedInstanceState);
        的setContentView(R.layout.main);        //打开用户preferences项活动
        最后Button按钮=(按钮)findViewById(R.id.check_ pref_button);
        button.setOnClickListener(新OnClickListener(){
            @覆盖
            公共无效的onClick(视图v){
                startActivity(新意图(
                        preferencesActivityExample.this,
                        EditAlert preferencesActivity.class));
            }
        });    }
}

的strings.xml

 <?XML版本=1.0编码=UTF-8&GT?;
<资源>
    <字符串名称=选择>选择< /串>
< /资源>


解决方案

问题是,在对话框中选择的 preference 值不保存/更新。
您可以轻松地验证这一点关闭活动和发射增益。你仍然会看到默认值注意到与定位改变。

FIX:您需要返回真正更新 preference

  @覆盖
在preferenceChange公共布尔(preference preference,对象为newValue){
    //这里做你所有其他的东西
    返回true;
}

真正来更新新值preference的状态。

I have been stuck on this for days and tried different workarounds. When I change screen orientation, the preference summary loses its value.

I have a custom ListPreference which when user clicks, pops up two choices for buddy - myself, and some other (in the actual program, user selects a buddy from Contacts).

I set the summary to the selected buddy's email address.

clicking preference pops up list preference which, depending on what is clicked, shows myself, or contacts picker to select a buddy.

'myself' was selected

flipping phone loses buddy

Here is a working program stripped to show the essentials.

class 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>

class 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>

arrays.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>

class 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));
            }
        });

    }
}

strings.xml

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

解决方案

Issue is that the Preference value selected on the dialog is not saved/updated. You can easily verify this Close the Activity and launch gain. You will still see the default value , noting to do with orientation change.

FIX: You need to return true to update the new value in preference.

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

True to update the state of the Preference with the new value.

这篇关于改变屏幕方向,当我的列表preference不会保留值的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆