3

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

尽管阅读了官方的 Android 文档以获取首选项,并且阅读了三本不同书籍中有关使用首选项的章节,但我还是遇到了这些问题。Android 文档通常都很好,但考虑到我(持续的)麻烦和大量关于此的 stackoverflow 问题,我认为这部分需要一些工作。</VENT>

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

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

4

2 回答 2

3

您似乎在 main 活动中使用了非默认 SharedPreferences "app_prefs",但您的 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);
        }
    }
    
于 2012-10-12T20:58:00.077 回答
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上的生命周期图很好地说明了这一点。

于 2012-10-12T20:46:14.800 回答