改变屏幕方向,当我的列表preference不会保留值 [英] My ListPreference does not persist values when changing screen orientation
问题描述
我一直停留在这几天,尝试了不同的解决方法。
当我改变屏幕方向,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:机器人=http://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(BUDDY)){
好友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:机器人=http://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 $ c中的新价值$ C>。
@覆盖
在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屋!