编辑我忘记了一大堆代码。 在这里插入。

  @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.xmlxml作为注释插入。 它也包含在下面,完好无损。

首选项存储在键focusscreen 对?

  @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 
    }
  }

preferences.xml

<PreferenceScreen xmlns:android="http://schemas.android.com/apk/res/android">
    <PreferenceCategory
        android:title="Screen options">
        >
        <CheckBoxPreference
            android:key="focus"
            android:title="@string/focusAfterShow"
            android:summary="Always place the cursor at the 'clue' (sum) after tapping 'Show'."
            android:defaultValue="false"
            />
        <CheckBoxPreference
            android:key="screen"
            android:title="@string/screenSaver"
            android:summary="Keep screen on at all times while running this app."
            android:defaultValue="false"
            />
    </PreferenceCategory>
</PreferenceScreen>

离开主屏幕的应用程序然后返回到它之后,prefs没有变化,如logcat所示。

然后我通过选中它的框来更改第一个pref。 logcat正确显示。 涉及的代码在SettingsFragment.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,但只有第一个值。

这是logcat ,只有我通过Log.w写的行。 有3个组可供查看:创建prefs并更改第一个pref,工作正常。 然后是第二个onCreate ,其中两个值都被认为是false ,这是错误的 - 首先是真的 - 但是设置屏幕显示我确实检查了第一个框。

对于我做错了什么,我一无所知。

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? *******************************************

在此输入图像描述在此输入图像描述

===============>>#1 票数:2 已采纳

这里的问题是你没有查找正确的首选项xml文件。 PreferenceFragment将保存到默认首选项xml文件中,并保存在MainActivity中,因为您使用的是getSharedPreferences(SETTINGS, MODE_PRIVATE) ,除了默认首选项xml文件外,还会创建一个新文件。

为了解决这个问题,只需将该代码更改为PreferenceManager.getDefaultSharedPreferences(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
        }
    }

还有一点需要注意,看起来下面这段代码不会像你想象的那样表现。 执行此代码不会在调用startActivity()暂停,它将继续执行。 因此,此处的日志将反映“设置活动”打开之前的SharedPreference的状态,而不是之后的状态。

此外,您还应该在此处使用默认的共享首选项。

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;

  ask by DSlomer64 translate from so

未解决问题?本站智能推荐:

1回复

为什么我的Android偏好设置没有更新?

我在xml文件中设置了一些首选项,并使用了标准结构(请参见下面的代码)使它们可用和可更新,并且一切工作正常。 由于这些都是出于测试目的,因此我现在想用我的实际应用程序首选项(包括完全删除一些首选项)替换它们,但是无论我做什么,似乎只能识别我设置的原始首选项。 我什至用我的新文件完全替换了xm
5回复

偏好设置屏幕启动时,Android App立即崩溃

我一直在为应用程序设置首选项屏幕,甚至在崩溃之前都没有显示它。 我检查了一些有关共享首选项的教程,我的代码与它们相似,但是没有任何效果。 我认为问题出在我的preferences.xml文件中,因为我注释掉了除在PreferenceActivity中打开XML文件以外的所有内容。 这是
1回复

如何在Android中按喜好更新变量

我尝试在android中开发软键盘,我想在扩展InputmethodeServise的类中使用Xml文件,以使其成为keyboardView的属性,并且我在布局资源中有几个xml(input1.xml,input2.xml, input3.xml),然后通过首选项调用这些xml: 而选择
1回复

如何使用EasySharedPreferences在android中加载更改的语言

我正在尝试通过使用EasySharedpreferences加载更改的语言,即时通讯有如何立即加载已保存的字符串结果的问题,这是代码:
1回复

如何在android XML中打开共享的首选项数据

我想做一个游戏层面的逻辑。 该游戏本身类似于徽标问答游戏。 它具有锁定和解锁级别。 我需要根据保存在共享首选项中的得分来显示锁定和解锁级别。 因此,如何访问XML文件中的score变量?
1回复

根据Int值显示动态图像(用于在主菜单上显示玩家的得分)– JAVA / XML / Android / Eclipse

免责声明 :我是Java / Xml的新手,请耐心等待。 我使用的是副本岛资源,因此,如果有更简便/更新的方法,请告诉我。 目标 :使用.PNG编号而不是文字在主菜单屏幕上显示球员的得分。 为什么? 因为我的.PNG编号比标准文本更加浮华/风格化。 当前 :我正在通过保存到Sh
2回复

如何在Android中保存TextView / Array并在以后检索?

我真的很陌生,并且在申请方面也不断取得进步。 我想创建一个允许用户使用滑块设置长度并生成密码的应用程序。 完成此操作后,我希望用户能够保存其生成的密码。 到目前为止,除了保存密码以在应用程序关闭后恢复密码之外,我已经实现了所有其他目的。 我已经阅读了很多文章,但我只是不明白如何在应用程序
1回复

Android首选项屏幕,仅全屏显示吗?

我在android中将功能齐全的“偏好设置”屏幕设置为横向。 我想做的是让它仅占据水平屏幕的一半。 有什么想法怎么做? 我的代码段如下: xml: 多谢你们, 本
1回复

Android:让应用使用“共享首选项”提醒答案

我目前正在为Android制作一个测验应用程序。 每个问题都有它自己的活动。 用户可以在文本框中键入答案。 如果用户键入了错误的答案,则不会发生任何事情,如果他输入正确答案,则应用必须记住他已完成该问题。 我曾经听说过,通过添加“ 共享偏好 ”,我可以让应用程序记住问题是否得到了回答
1回复

E / MotionRecognitionManager:mSContextService导致应用程序在我的Android手机上崩溃

这里存在一个与此类似的问题: Android中的动作识别管理器和动作服务 我问我的是因为有一条评论请求错误发生的代码并且没有提供代码。 这是我的第一个问题,所以我希望我没有做错或粗鲁的事情。 我正在开发一个解析RSS源的应用程序,并具有用户可以更改的设置,如背景颜色,文本颜色,用户