3

2 つの 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

設定アクティビティが終了したら、どうにかして設定をリロードする必要があります。onCreate() の代わりに onResume() にロードするという Dirol の提案は素晴らしいと思いました。あなたはそれを試しましたか?それとも私も問題を誤解していますか?

私の場合、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

onCreate() メソッドでのみ設定をロードします。そのメソッドは、新しいアクティビティが開始されたときにのみ呼び出されます。addPreferencesFromResource は xml ファイルをプリファレンスに拡張するため、addPreferencesFromResource が呼び出された時点で既に xml に格納されている情報のみを取得できます。後でではありません。

そのメソッドを onResume に移動してみてください。ただし、メモリリークに注意してください。addPreferencesFromResource が何をするのか正確にはわかりませんが、ドキュメントからは、そのメソッドのアクティビティについて非常に疑わしいと思います。

于 2011-07-03T18:06:02.023 に答える
1

私は同じ問題を抱えていて、次のように解決しました:

メイン アクティビティ クラスは 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 に答える
0

私は同じ問題を抱えていました...設定インスタンスを作成し、そのデータを必要なすべてのクラスとすべてのアクティビティにロードしてみてください。それは私のために働いた...それが役立つことを願っています.

于 2012-05-16T07:51:25.270 に答える