当后退按钮被按下时,新的首选项没有加载



我有这个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()方法或等效中重用它们。

最新更新