首选项活动设置更改不会粘

时间:2012-10-12 20:18:16

标签: android sharedpreferences preferenceactivity

到目前为止,我已经记录了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上。

<VENT>为了记录,这里是我迄今为止与偏好战斗(并赢得)的战斗:

  1. XML首选项文件在Eclipse树中的位置以及内容 叫它。
  2. 如何强制首选项活动将值限制为 整数或浮点数。
  3. 将偏好值指定为 XML中的整数或浮点数不会使首选项成为 整数或浮点数 - 它仍然是一个字符串。
  4. 尽管有几种方法 取名为共享首选项文件的唯一方法 实际上只会加载文件是addPreferencesFromResource() 来自PreferenceActivity。我必须冗余地编写默认值 XML和第一个prefs getter,除非我解析XML。
  5. 尽管阅读了有关偏好的官方Android文档,尽管阅读了有关在三本不同书中使用偏好的章节,但我还是遇到了这些问题。 Android文档通常非常好,但考虑到我(继续)的麻烦和大量有关此问题的stackoverflow问题,我认为这部分需要一些工作。</VENT>

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

    P.S。我意识到非片段方法现在已被弃用,但我是Android新手,并且生产原型的时间紧迫,除了我的Nexus 7平板电脑之外不需要运行任何东西。我更喜欢它,虽然现在看起来我没有随时保存。

2 个答案:

答案 0 :(得分:3)

您似乎在主活动"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);
        }
    }
    

答案 1 :(得分:2)

我认为该代码段的问题在于您正在使用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处的生命周期图说明了这一点。