3

我有一个保存两个 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;

      }

 }   
4

6 回答 6

2

当首选项活动完成时,您需要以某种方式重新加载您的首选项。我认为 Dirol 将它们加载到 onResume() 而不是 onCreate() 的建议非常好;你试过吗?还是我也误解了这个问题。

在我自己的情况下,我使用 startActivityForResult() 启动了首选项活动,然后在活动结果回调中,我重新加载了首选项。

代码片段:

@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() 以查看它是否也有效。

于 2011-07-03T19:37:28.960 回答
2

尝试覆盖 onBackPressed() 方法。

如果您的“向上”按钮(左上角 <-)提供了正确的结果,那么您可以将“后退”按钮设置为类似于“向上”按钮的行为。

@Override
public void onBackPressed() {
    super.onBackPressed();
    NavUtils.navigateUpFromSameTask(this);
}
于 2017-01-29T09:34:27.233 回答
1

我有同样的问题并解决如下:

主Activity类实现了OnSharedPreferenceChangeListener:

public class Activity_name extends Activity implements OnSharedPreferenceChangeListener  {
    ...
}

在主活动类中,只要首选项条目发生更改,就会运行 onSharedPreferenceChanged。我只是像在 onCreate 中那样从首选项中更新我的所有变量:

@Override
public void onSharedPreferenceChanged(SharedPreferences prefs, String key) {
    <read all preferences as you did in onCreate()>
}

这可以解决问题,我希望它可以为您节省一些时间来寻找解决方案。

于 2012-05-16T07:36:03.277 回答
1

您仅在 onCreate() 方法上加载首选项。该方法仅在新活动启动时调用。addPreferencesFromResource 将 xml 文件扩展为首选项,因此您只能获取在调用 addPreferencesFromResource 时已经存储在 xml 中的信息,而不是之后。

尝试将该方法移至 onResume。但请注意内存泄漏。我不确切知道 addPreferencesFromResource 做了什么,但从文档中 - 我会对该方法活动非常怀疑。

于 2011-07-03T18:06:02.023 回答
0

我遇到了同样的问题...尝试创建首选项实例并将其数据加载到您需要的每个类和每个活动中。它对我有用......希望它有所帮助。

于 2012-05-16T07:51:25.270 回答
0

您将需要重新加载您的视图或使用这些首选项的任何对象,最好是在首选项活动关闭时。

偏好活动不会改变任何东西,只是一个包含您偏好的内部文件(键=值列表)。当它被改变时,preferenceActivity调用onPreferenceChaged(),仅此而已。它本身不会刷新你的东西。您需要重新加载首选项并在onResume()方法或等效项中重用它们。

于 2015-08-16T23:24:01.467 回答