Java onCreate after“不一致地报告Android首选项设置”;“第一次使用”--是我的错,但怎么会呢?
编辑我忘了一大块代码。就插在这里Java onCreate after“不一致地报告Android首选项设置”;“第一次使用”--是我的错,但怎么会呢?,java,android,xml,sharedpreferences,Java,Android,Xml,Sharedpreferences,编辑我忘了一大块代码。就插在这里 @Override public boolean onOptionsItemSelected(MenuItem item) { Log.w("Before switch", (String) item.getTitle()); switch (item.getItemId()) { case R.id.menu_settings: Log.w("Before intent","\n"); Int
@Override
public boolean onOptionsItemSelected(MenuItem item) {
Log.w("Before switch", (String) item.getTitle());
switch (item.getItemId()) {
case R.id.menu_settings:
Log.w("Before intent","\n");
Intent intent = new Intent(this, SettingsActivity.class);
startActivity(intent);
Log.w("back from intent", "\n");
preferences = getSharedPreferences(SETTINGS, MODE_PRIVATE);
focusAtClue = preferences.getBoolean("focus",true);
screenSaver = preferences.getBoolean("screen",true);
Log.w("after intent", focusAtClue + " " + screenSaver);
return true;
default:
Log.w("onOptItemSel","default");
return super.onOptionsItemSelected(item);
}
}
}
这里的onCreate
代码用于创建首选项,如图所示。preferences.xml
中的xml
作为注释插入。它也包括在下面,完好无损
首选项存储在按键焦点
和屏幕
下。对吧?
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
preferences = getSharedPreferences(SETTINGS, MODE_PRIVATE);
boolean firstUse = preferences.getBoolean(FIRST_USE, true);
if (firstUse){
Toast helloMessage = Toast.makeText(getApplicationContext(), "Hello First Time User",Toast.LENGTH_LONG);
helloMessage.show();
editor = preferences.edit();
editor.putBoolean(FIRST_USE, false);
editor.putBoolean ("focus", false);
/*NOTE THE MATCHED STRING vvvvv
<CheckBoxPreference
android:key="focus" android:title="@string/focusAfterShow" android:summary="Always place the cursor" android:defaultValue="false"/> */
editor.putBoolean ("screen", false);
/*NOTE THE MATCHED STRING vvvvvv
<CheckBoxPreference
android:key="screen" android:title="@string/screenSaver" android:summary="Keep screen on" android:defaultValue="false" /> */
editor.commit();
}
else {
///////////////////// problems here *******************
SharedPreferences preferences = getSharedPreferences(SETTINGS, MODE_PRIVATE);
focusAtClue = preferences.getBoolean("focus",focusAtClue);
screenSaver = preferences.getBoolean("screen",screenSaver);
Log.w("oncreate:", focusAtClue + " " + screenSaver);
///////////////////// problems
}
}
离开应用程序进入主屏幕,然后返回主屏幕后,prefs没有变化,如logcat
所示
然后我通过选中第一个pref框来更改它。logcat
正确显示了这一点。所涉及的代码在设置片段.java
中:
package com.bffmedia.hour11app;
import android.content.SharedPreferences;
import android.content.SharedPreferences.OnSharedPreferenceChangeListener;
import android.os.Bundle;
import android.preference.PreferenceFragment;
import android.util.Log;
public class SettingsFragment extends PreferenceFragment implements OnSharedPreferenceChangeListener {
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
addPreferencesFromResource(R.xml.preferences);
}
@Override
public void onResume() {
super.onResume();
getPreferenceScreen().getSharedPreferences().registerOnSharedPreferenceChangeListener(this);
}
@Override
public void onPause() {
super.onPause();
getPreferenceScreen().getSharedPreferences().unregisterOnSharedPreferenceChangeListener(this);
}
@Override
public void onSharedPreferenceChanged(SharedPreferences sharedPreferences, String key) {
//SharedPreferences sharedPref = PreferenceManager.getDefaultSharedPreferences(getActivity());
Log.w("onSharedPrefChgd", sharedPreferences.getBoolean("focus",false) + " " + sharedPreferences.getBoolean("screen",false));
}
}
然后我从内存中的应用列表中删除该应用,然后从应用图标运行它
onCreate
表示两个值都为FALSE,但只有第一个值为FALSE
这里是logcat
,只有我通过Log.w
写的行。有3个组需要考虑:创建pref和更改第一个pref,这两个组都很好。然后是第二个onCreate
,其中两个值都称为false
,这是错误的——第一个值为true——但是设置屏幕显示我选中了第一个框。
我不知道我做错了什么
05-16 13:25:20.290 18778-18778/com.bffmedia.hour11app W/Before switch? Settings
05-16 13:25:20.291 18778-18778/com.bffmedia.hour11app W/Before intent? [
05-16 13:25:20.292 438:0x1a07 I/ActivityManager ]
START u0 {cmp=com.bffmedia.hour11app/.SettingsActivity} from pid 18778
05-16 13:25:20.449 18778-18778/com.bffmedia.hour11app W/back from intent?
05-16 13:25:20.450 18778:0x495a W/after intent ]
false false ***************************** CORRECT ************************
05-16 13:35:16.717 18778-18778/com.bffmedia.hour11app W/onSharedPrefChgd?
true false *********************************** CORRECT
05-16 13:37:21.185 20014-20014/com.bffmedia.hour11app W/Before switch? Settings
05-16 13:37:21.186 20014-20014/com.bffmedia.hour11app W/Before intent? [
05-16 13:37:21.188 438:0x2ef I/ActivityManager ]
START u0 {cmp=com.bffmedia.hour11app/.SettingsActivity} from pid 20014
05-16 13:37:21.245 20014-20014/com.bffmedia.hour11app W/back from intent? [
05-16 13:37:21.245 20014:0x4e2e W/after intent ]
false false *************************************** WHY? *******************************************
这里的问题是您没有在正确的首选项xml文件中查找。
PreferenceFragment
中的首选项将保存到默认首选项xml文件中,并且在MainActivity中,因为您使用的是getSharedReferences(SETTINGS,MODE_PRIVATE)
,它将在默认首选项xml文件之外创建一个新文件
为了修复它,只需将该代码更改为PreferenceManager.getDefaultSharedReferences(this)
,然后您将查看PreferenceFragment
使用的相同首选项xml文件
更多信息,还有
这里是所有你需要做的事情来修复它,我刚刚测试了它,它的工作
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
//preferences = getSharedPreferences(SETTINGS, MODE_PRIVATE);
//use this instead:
preferences = PreferenceManager.getDefaultSharedPreferences(this);
boolean firstUse = preferences.getBoolean(FIRST_USE, true);
if (firstUse){
Toast helloMessage = Toast.makeText(getApplicationContext(), "Hello First Time User",Toast.LENGTH_LONG);
helloMessage.show();
editor = preferences.edit();
editor.putBoolean(FIRST_USE, false);
editor.putBoolean ("focus", false);
/*NOTE THE MATCHED STRING vvvvv
<CheckBoxPreference
android:key="focus" android:title="@string/focusAfterShow" android:summary="Always place the cursor" android:defaultValue="false"/> */
editor.putBoolean ("screen", false);
/*NOTE THE MATCHED STRING vvvvvv
<CheckBoxPreference
android:key="screen" android:title="@string/screenSaver" android:summary="Keep screen on" android:defaultValue="false" /> */
editor.commit();
}
else {
///////////////////// problems here *******************
//no need to create another preferences, it's already defined above
//SharedPreferences preferences = getSharedPreferences(SETTINGS, MODE_PRIVATE);
//This should work now!!!!!!
focusAtClue = preferences.getBoolean("focus",focusAtClue);
screenSaver = preferences.getBoolean("screen",screenSaver);
Log.w("oncreate:", focusAtClue + " " + screenSaver);
Toast helloMessage = Toast.makeText(getApplicationContext(), "Hello Returning User " + focusAtClue + " " + screenSaver,Toast.LENGTH_LONG);
helloMessage.show();
///////////////////// problems
}
}
@丹尼尔——真有趣。。。在编辑之前,我刚刚醒来并实施了你的建议。谢谢我现在显然还不明白,但它确实对我起了作用。我甚至添加了一个
按钮
,随时告诉我首选项,它也可以工作。现在阅读您的编辑。@DSlomer64没问题!好的,在这之前它可能已经工作了一半,因为您正在将首次使用
、焦点
、和屏幕
首选项的默认值写入一个文件,但随后您的设置活动正在写入另一个首选项文件(默认文件),以更改焦点
,以及屏幕
。因为看起来您不需要有多个首选项文件,所以只需对所有首选项使用PreferenceManager.getDefaultSharedPreferences(this)
,就可以了!我从Log.w中删除了代码("通过下一个日志返回…
。我已经阅读了你的编辑,这促使我说我不明白,但还是多亏了你。--我想最后的评论做到了。我对获取默认共享pref的想法是错误的。你是对的。我不需要两个pref文件。再次感谢。@DSlomer64完全没有问题!很高兴它现在对你有用!
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
//preferences = getSharedPreferences(SETTINGS, MODE_PRIVATE);
//use this instead:
preferences = PreferenceManager.getDefaultSharedPreferences(this);
boolean firstUse = preferences.getBoolean(FIRST_USE, true);
if (firstUse){
Toast helloMessage = Toast.makeText(getApplicationContext(), "Hello First Time User",Toast.LENGTH_LONG);
helloMessage.show();
editor = preferences.edit();
editor.putBoolean(FIRST_USE, false);
editor.putBoolean ("focus", false);
/*NOTE THE MATCHED STRING vvvvv
<CheckBoxPreference
android:key="focus" android:title="@string/focusAfterShow" android:summary="Always place the cursor" android:defaultValue="false"/> */
editor.putBoolean ("screen", false);
/*NOTE THE MATCHED STRING vvvvvv
<CheckBoxPreference
android:key="screen" android:title="@string/screenSaver" android:summary="Keep screen on" android:defaultValue="false" /> */
editor.commit();
}
else {
///////////////////// problems here *******************
//no need to create another preferences, it's already defined above
//SharedPreferences preferences = getSharedPreferences(SETTINGS, MODE_PRIVATE);
//This should work now!!!!!!
focusAtClue = preferences.getBoolean("focus",focusAtClue);
screenSaver = preferences.getBoolean("screen",screenSaver);
Log.w("oncreate:", focusAtClue + " " + screenSaver);
Toast helloMessage = Toast.makeText(getApplicationContext(), "Hello Returning User " + focusAtClue + " " + screenSaver,Toast.LENGTH_LONG);
helloMessage.show();
///////////////////// problems
}
}
Intent intent = new Intent(this, SettingsActivity.class);
startActivity(intent);
Log.w("back from intent", "\n");
//preferences = getSharedPreferences(SETTINGS, MODE_PRIVATE);
preferences = PreferenceManager.getDefaultSharedPreferences(this);
focusAtClue = preferences.getBoolean("focus",true);
screenSaver = preferences.getBoolean("screen",true);
Log.w("after intent", focusAtClue + " " + screenSaver);
return true;