1

我在网上得到了这个代码,我正在寻找对其进行更改。基本上,当我单击“显示共享首选项”,然后单击“首选项屏幕”,进行一些更改,然后单击“返回”时,显示的首选项不会更新,直到我再次单击“显示共享首选项”按钮。如何让偏好自动更新……我需要一个监听器吗?

PreferenceDemoTestActivity.java

package Preference.Demo;

import android.app.Activity;
import android.content.Intent;
import android.content.SharedPreferences;
import android.os.Bundle;
import android.preference.PreferenceManager;
import android.view.View;
import android.widget.Button;
import android.widget.TextView;

public class PreferenceDemoTestActivity extends Activity {
TextView textView;

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

   Button btnPrefs = (Button) findViewById(R.id.btnPrefs);
   Button btnGetPrefs = (Button) findViewById(R.id.btnGetPreferences);

   textView = (TextView) findViewById(R.id.txtPrefs);

   View.OnClickListener listener = new View.OnClickListener() {

   @Override
   public void onClick(View v) {
   switch (v.getId()) {
   case R.id.btnPrefs:
      Intent intent = new Intent(PreferenceDemoTestActivity.this,
          PrefsActivity.class);
      startActivity(intent);
      break;

   case R.id.btnGetPreferences:
      displaySharedPreferences();
      break;

   default:
     break;
   }
   }
   };

   btnPrefs.setOnClickListener(listener);
   btnGetPrefs.setOnClickListener(listener);
}

private void displaySharedPreferences() {
   SharedPreferences prefs = PreferenceManager
    .getDefaultSharedPreferences(PreferenceDemoTestActivity.this);

   String username = prefs.getString("username", "Default NickName");
   String passw = prefs.getString("password", "Default Password");
   boolean checkBox = prefs.getBoolean("checkBox", false);
   String listPrefs = prefs.getString("listpref", "Default list prefs");

   StringBuilder builder = new StringBuilder();
   builder.append("Username: " + username + "\n");
   builder.append("Password: " + passw + "\n");
   builder.append("Keep me logged in: " + String.valueOf(checkBox) + "\n");
   builder.append("List preference: " + listPrefs);

   textView.setText(builder.toString());
}
}

PrefsActivity.java

package Preference.Demo;


import android.os.Bundle;
import android.preference.PreferenceActivity;


public class PrefsActivity extends PreferenceActivity{

@Override
protected void onCreate(Bundle savedInstanceState) {
   super.onCreate(savedInstanceState);
   addPreferencesFromResource(R.xml.prefs);
}
}

主要的.xml

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
  android:layout_width="fill_parent"
  android:layout_height="fill_parent"
  android:orientation="vertical" >

<Button
  android:id="@+id/btnPrefs"
  android:layout_width="wrap_content"
  android:layout_height="wrap_content"
  android:text="Preferences Screen" />

<Button
  android:id="@+id/btnGetPreferences"
  android:layout_width="wrap_content"
  android:layout_height="wrap_content"
  android:text="Display Shared Preferences" />

<TextView
  android:id="@+id/txtPrefs"
  android:layout_width="wrap_content"
  android:layout_height="wrap_content" />

</LinearLayout>
4

2 回答 2

1

SharedPreferences只需使用Activity 方法中的值更新变量onResume(),然后更新 UI。

您的值没有改变,因为即使您在 Preference Screen 中更新了它们,您的 Activity 手也简单地恢复了它的旧实例并使用存储在变量中的值。

在您的情况下,简单的调用displaySharedPreferences()fromonResume()就足够了。

于 2012-11-17T14:55:19.327 回答
0

您可以注册onCreate()方法的更改:

getPreferenceScreen().getSharedPreferences().registerOnSharedPreferenceChangeListener(this);

然后使用:

public void onSharedPreferenceChanged(SharedPreferences sharedPreferences, String key) {
SharedPreferences.Editor editor = sharedPreferences.edit();
// Update your preferences here 

}

然后不要忘记将其注销onDestroy()

getPreferenceScreen().getSharedPreferences().unregisterOnSharedPreferenceChangeListener(this);
于 2012-11-17T15:00:32.060 回答