我有这个preferences类(如下),它保存了两个ListPreferences,但是如果更改了ListPreferences并且按下了后退按钮,则除非重新启动应用程序,否则更改不会生效。我错过什么了吗?我到处都找遍了,但似乎就是找不到合适的答案。请帮助。
public class Preferences extends PreferenceActivity {
@Override
public void onCreate(Bundle savedInstanceState){
super.onCreate(savedInstanceState);
addPreferencesFromResource(R.xml.preferences);
}
@Override
public void onPause() {
super.onPause();
}
@Override
public void onResume() {
super.onResume();
}
}
应用程序代码 public class Quotes extends Activity implements OnClickListener {
ProgressDialog dialog;
private WebView webview;
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
SharedPreferences SP = PreferenceManager.getDefaultSharedPreferences(getBaseContext());
String q = SP.getString("appViewType","http://www.google.com");
String c = SP.getString("appRefreshRate","20");
webview = (WebView) findViewById(R.id.scroll);
webview.getSettings().setJavaScriptEnabled(true);
webview.setWebViewClient(new QuotesWebView(this));
webview.loadUrl(q);
ScheduledExecutorService timer = Executors.newSingleThreadScheduledExecutor();
timer.scheduleAtFixedRate(new Runnable() {
@Override
public void run() {
webview.reload();
}
}, 10, Long.parseLong(c),TimeUnit.SECONDS);
findViewById(R.id.refresh).setOnClickListener(this);
}
@Override
public void onPause(){
super.onPause();
}
@Override
public void onResume(){
super.onResume();
}
public void onClick(View v){
switch(v.getId()){
case R.id.refresh:
webview.reload();
break;
}
}
@Override
public boolean onCreateOptionsMenu(Menu menu) {
MenuInflater inflater = getMenuInflater();
inflater.inflate(R.menu.menu, menu);
MenuItem about = menu.getItem(0);
about.setIntent(new Intent(this, About.class));
MenuItem preferences = menu.getItem(1);
preferences.setIntent(new Intent(this, Preferences.class));
return true;
}
}
您需要在参数设置活动结束时重新加载您的参数设置。我认为Dirol的建议加载他们在onResume()而不是onCreate()是优秀的;你试过吗?还是我也误解了问题。
在我自己的例子中,我用startActivityForResult()启动了preferences活动,然后在活动结果回调时,我重新加载了preferences。
代码片段:
@Override
public boolean onOptionsItemSelected(MenuItem item) {
switch (item.getItemId()) {
case MENU_PREFERENCES:
Intent intent = new Intent().setClass(this, CalcPreferences.class);
startActivityForResult(intent, MENU_PREFERENCES);
break;
default: return super.onOptionsItemSelected(item);
}
return true;
}
@Override
protected void onActivityResult(int req, int result, Intent data) {
switch( req ) {
case MENU_PREFERENCES:
SharedPreferences sp =
PreferenceManager.getDefaultSharedPreferences(this);
updatePreferences(sp);
break;
default:
super.onActivityResult(req, result, data);
break;
}
}
@Override
protected void updatePreferences(SharedPreferences sp) {
super.updatePreferences(sp);
keyclick = sp.getBoolean("keyclick", keyclick);
}
不管怎样,这对我来说是有效的。我可以尝试移动我的updatePreferences()调用onResume()自己,看看是否也工作。
尝试重写onBackPressed()方法。
如果你的"向上"按钮(左上角<-)提供了正确的结果,那么你可以设置后退按钮像向上按钮一样。
@Override
public void onBackPressed() {
super.onBackPressed();
NavUtils.navigateUpFromSameTask(this);
}
只能在onCreate()方法上加载首选项。该方法仅在新活动启动时调用。addPreferencesFromResource将xml文件扩展为首选项,因此您只获得信息,这些信息在调用addPreferencesFromResource时已经存储在xml中,而不是在调用addPreferencesFromResource之后。
尝试将该方法移动到onResume。但是要注意内存泄漏。我不知道addPreferencesFromResource到底是做什么的,但从文档来看,我对这个方法活动非常怀疑。
我有同样的问题,并解决如下:
主活动类实现OnSharedPreferenceChangeListener:
public class Activity_name extends Activity implements OnSharedPreferenceChangeListener {
...
}
在主活动类中,当一个首选项发生变化时,onsharedpreferencechange就会运行。我只需从首选项中更新所有变量,就像我在onCreate:
中所做的那样@Override
public void onSharedPreferenceChanged(SharedPreferences prefs, String key) {
<read all preferences as you did in onCreate()>
}
我有同样的问题…尝试创建首选项实例,并在需要的每个类和每个活动中加载它的数据。这对我很有效……
你需要重新加载你的视图或任何使用这些首选项的对象,最好是在首选项活动关闭时。
preferences活动不会改变任何东西,只会改变一个包含您的首选项(key=value list)的内部文件。当它被改变时,preferenceActivity
调用onPreferenceChaged()
,仅此而已。它不会自己刷新你的东西。您需要重新加载prefs,并在onResume()
方法或等效中重用它们。