【问题标题】:Preferences activity setting changes won't stick首选项活动设置更改不会坚持
【发布时间】:2012-10-03 16:59:03
【问题描述】:

到目前为止,我已经记录了大约 6 个小时与 Android 偏好作斗争,包括查看和尝试许多 stackoverflow 建议。我最近的问题是,我从偏好活动中所做的更改并没有延续到我的主要活动中。我已经提炼了代码。

主要活动:

public class MainActivity extends Activity {

    /*...*/

    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        /*...*/
    }

    @Override
    public boolean onOptionsItemSelected(MenuItem item)
    {
        super.onOptionsItemSelected(item);
        switch(item.getItemId())
        {
        case R.id.menu_settings:
            startActivity(new Intent(this, PrefsActivity.class));
            return true;
        }
        return false;
    }

    @Override
    public void onStart()
    {
        super.onStart();

        SharedPreferences prefs = getSharedPreferences("app_prefs", MODE_PRIVATE);
        int somePrefValue = prefs.getInt("somePrefKey", 1);
        /*...*/
    }
}

偏好活动:

public class PrefsActivity extends PreferenceActivity {

    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        addPreferencesFromResource(R.xml.app_prefs);
    }
}

偏好资源:

<?xml version="1.0" encoding="utf-8"?>
<PreferenceScreen xmlns:android="http://schemas.android.com/apk/res/android">

    <PreferenceCategory android:title="Some Category">

        <EditTextPreference
            android:key="somePrefKey"
            android:title="Some Preference"
            android:defaultValue="1"
            android:numeric="integer" /> 

    </PreferenceCategory>

</PreferenceScreen>

万一这很重要,我在 4.1 中遇到了这个问题,无论是在模拟器上还是在 Nexus 7 上。

&lt;VENT&gt;记录在案,以下是我迄今为止根据偏好打过(并赢得过)的战斗:

  1. XML 首选项文件在 Eclipse 树中的位置以及要做什么 调用它。
  2. 如何强制首选项活动将值限制为 整数或浮点数。
  3. 将首选项值指定为 XML 中的整数或浮点数不会使首选项成为 整数或浮点数——它仍然是一个字符串。
  4. 尽管有几种方法 取共享首选项文件的名称,这是唯一的方法 将实际加载的文件是 addPreferencesFromResource(),只有 来自 PreferenceActivity。我必须在 XML 和第一个 prefs getter,除非我解析 XML。

尽管阅读了有关偏好设置的官方 Android 文档以及阅读了三本不同书籍中关于使用偏好设置的章节,但我还是遇到了这些问题。 Android 文档总体上还不错,但考虑到我(持续的)麻烦和大量关于此的 stackoverflow 问题,我认为这部分需要一些工作。&lt;/VENT&gt;

感谢您为我的最新问题提供的任何帮助。

附:我意识到非片段方法现在已被弃用,但我是 Android 新手,并且生产原型的截止日期很紧,该原型不需要在我的 Nexus 7 平板电脑上运行。我更喜欢简单的,虽然现在看起来我没有节省任何时间。

【问题讨论】:

    标签: android sharedpreferences preferenceactivity


    【解决方案1】:

    我认为该代码 sn-p 的问题在于您正在使用 onStart,当您转到 PrefsActivity 然后返回 MainActivity 时可能不会调用它。 相反,您想像这样使用 onResume():

    @Override
    public void onResume()
    {
        super.onResume();
    
        SharedPreferences prefs = getSharedPreferences("app_prefs", MODE_PRIVATE);
        int somePrefValue = prefs.getInt("somePrefKey", 1);
        /*...*/
    }
    

    当你回到 MainActivity 时肯定会调用 onResume。

    http://developer.android.com/reference/android/app/Activity.html#ActivityLifecycle 的生命周期图很好地说明了这一点。

    【讨论】:

    • 谢谢路易斯。我应该提到我的 onStart() 也在写入主要活动的屏幕日志,因此我可以看到首选项活动的每个返回都被记录在对 onStart() 的新调用中。只是为了笑,我把它移到了 onResume(),但没有改变。所以,如果问题不明显,我想知道这是否是操作系统的问题。我会尝试不同的模拟器...
    • 顺便说一句,这是一个很好的图表,但是 Reto Meier 的书Android 4 Application Development 有一个更清晰的图表。它清楚地表明 onStart()...onStop() 序列将可见活动的会话括起来。如果活动不再可见并再次可见,则调用 onStart() ,正如我的日志所示。不过,onResume() 对于我的目的可能更强大。
    【解决方案2】:

    您似乎在主要活动"app_prefs" 中使用了非默认 SharedPreferences,但您的 PreferenceActivity 没有引用它,并且可能存储到默认 SharedPreferences。

    您应该任一

    1. 在 Main 活动中使用默认的 SharedPreferences,而不是命名的:(也按照 louielouie 的建议移动到 onResume)

      @Override
      public void onResume()
      {
          super.onResume();
      
          SharedPreferences prefs = 
             PreferenceManager.getDefaultSharedPreferences(getApplicationContext());
      
          int somePrefValue = Integer.valueOf(prefs.getString("somePrefKey", "1"));
          /*...*/
      }
      

    2. 告诉您的 PreferenceActivity 您要使用的 SharedPreferences 的名称:

      public class PrefsActivity extends PreferenceActivity {
      
          @Override
          public void onCreate(Bundle savedInstanceState) {
              super.onCreate(savedInstanceState);
              getPreferenceManager().setSharedPreferencesName("app_prefs"); //ADD ME
              addPreferencesFromResource(R.xml.app_prefs);
          }
      }
      

    【讨论】:

    • 谢谢蒂姆。我完全按照您的建议进行了更改,但我仍然遇到同样的问题。我还需要做其他事情吗?我没有看到首选项活动如何加载到默认共享首选项中。
    • @JoeLapp 你做了哪些改变,#1 还是#2?你不应该同时做这两个。我建议始终使用默认共享首选项,而不是命名。另外我认为您可能会遇到问题,因为您的 PreferenceActivity 可能将 somePrefKey 存储为String,而不是int。所以你应该改用prefs.getString("somePrefKey", "1");
    • @JoeLapp “我没有看到首选项活动是如何加载到默认共享首选项中的。”,这应该在 PreferenceActivity 中自动发生。一旦您更改活动中的任何内容,它就会自动提交到默认首选项文件。
    • 蒂姆说得很好。我总是使用选项 #1,即我总是使用 SharedPreferences prefs = PreferenceManager.getDefaultSharedPreferences(getApplicationContext());
    • 它正在工作!我的铸造问题是我正在阅读的下一个偏好,它必须以某种方式从以前的调试会话中残留。呜呼!!!我在首选项活动中设置的首选项现在将延续到主要活动。谢谢!!!!
    猜你喜欢
    • 2014-05-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-01-06
    相关资源
    最近更新 更多