簡體   English   中英

按下后退按鈕時未加載新首選項

[英]New Preferences not loading when back button is pressed

我有這個首選項 class(如下),它保存了兩個 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;

      }

 }   

嘗試覆蓋 onBackPressed() 方法。

如果您的“向上”按鈕(左上角 <-)提供了正確的結果,那么您可以將“后退”按鈕設置為類似於“向上”按鈕的行為。

@Override
public void onBackPressed() {
    super.onBackPressed();
    NavUtils.navigateUpFromSameTask(this);
}

當首選項活動完成時,您需要以某種方式重新加載您的首選項。 我認為 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() 以查看它是否也有效。

我有同樣的問題並解決如下:

主要活動 class 實現 OnSharedPreferenceChangeListener:

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

在主要活動 class 中,只要首選項條目發生更改,就會運行 onSharedPreferenceChanged。 我只是像在 onCreate 中那樣從首選項中更新我的所有變量:

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

這可以解決問題,我希望它可以為您節省一些時間來尋找解決方案。

您僅在 onCreate() 方法上加載首選項。 該方法僅在新活動啟動時調用。 addPreferencesFromResource 將 xml 文件膨脹到首選項中,因此您只能獲取在調用 addPreferencesFromResource 時已經存儲在 xml 中的信息,而不是之后。

嘗試將該方法移至 onResume。 但請注意 memory 泄漏。 我不確切知道 addPreferencesFromResource 做了什么,但從文檔中 - 我會對該方法活動非常懷疑。

我遇到了同樣的問題...嘗試創建首選項實例並將其數據加載到每個 class 以及您需要的每個活動中。 它對我有用......希望它有所幫助。

您將需要重新加載您的視圖或使用這些首選項的任何 object,最好是在首選項活動關閉時。

偏好活動不會改變任何東西,只是一個包含您偏好的內部文件(鍵=值列表)。 當它被改變時, preferenceActivity調用onPreferenceChaged()僅此而已。 它本身不會刷新你的東西。 您需要重新加載首選項並在onResume()方法或等效方法中重用它們。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM