[英]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.