Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/202.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java onCreate after“不一致地报告Android首选项设置”;“第一次使用”--是我的错,但怎么会呢?_Java_Android_Xml_Sharedpreferences - Fatal编程技术网

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;