在没有PreferenceActivity的情况下阅读SharedPreferences时会感到困惑

时间:2016-09-27 19:59:20

标签: android sharedpreferences

因为我想在所有设置子菜单上设置AppCompat操作栏,所以我必须实施一种解决方法,我的设置活动扩展AppCompatActivity,而不是PreferenceActivity。我在活动中使用PreferenceFragment来处理首选项,每个PreferenceScreen都有自己的xml文件,PreferenceFragment会为设置中的每个子菜单切换出来。所有这一切都是让Action Bar继续通过我的所有子菜单所必需的。

我试图从我的MainActivity中读取共享首选项文件中的字符串值,并且我尝试了三种不同的方法来获取这些信息,但没有一种方法有效:

SharedPreferences sharedPref = PreferenceManager.getDefaultSharedPreferences(this);
String btSelectPref = sharedPref.getString(getString(R.string.bt_select_key), "");

SharedPreferences sharedPref = getSharedPreferences(name, MODE_PRIVATE);
String btSelectPref = sharedPref.getString(getString(R.string.bt_select_key), "");

SharedPreferences sharedPref = getPreferences(MODE_PRIVATE);
String btSelectPref = sharedPref.getString(getString(R.string.bt_select_key), "");

以下是我的偏好.xml的相关部分:

<PreferenceCategory
    android:title="Bluetooth"
    android:key="pref_bt">
    <Preference
        android:title="Select Bluetooth Device"
        android:key="@string/bt_select_key"
        android:defaultValue="0">
    </Preference>
</PreferenceCategory>

这应该使用&#34; 0&#34;填充btSelectPref字符串,但在测试时它总是为空。我已在我的MainActivity中的onCreate中包含PreferenceManager.setDefaultValues(this, R.xml.preferences, false);,因此应设置默认值。

我不确定我应该使用哪些方法,因为我的设置有多个资源文件,但它们似乎都不适用于我。在getSharedPreferences(name, MODE_PRIVATE)的情况下,我不知道name参数应该引用什么,因为我从未命名过我的共享首选项文件。

编辑:事实证明我的问题与从共享首选项文件中获取值无关。我只是在我试图检查值的首选项上使用了错误的xml标记。我将其从通用<Preference>标记更改为<ListPreference>,我的代码开始使用PreferenceManager.getDefaultSharedPreferences()

2 个答案:

答案 0 :(得分:1)

您想做什么以及您在做什么不同。如果您只想为密钥设置默认共享首选项,则请考虑此示例。如果您的整个活动只有一个共享的pref文件,那么您不需要指定任何名称。它会自动获得它。

public MainActivity extends AppCompatActivity {

    SharedPreferences mPrefs;
    int test;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_counter);

        mPrefs = this.getPreferences(Context.MODE_PRIVATE);
        test = mPrefs.getInt("pref_bt_select", 0);}
}

对于上面的示例,您可以在strings.xml中定义键和默认值,然后在查找所需的首选项时可以参考它。

答案 1 :(得分:0)

嘿我已经将AppCompat用于我的偏好屏幕。我这样做是因为我想使用Vintage Chroma,这是唯一的方法。但是我能够使用PreferenceManager.getDefaultSharedPreference()而没有任何错误。

此外,如果您想在片段中使用默认的共享偏好设置,您可以使用:

SharedPreferences preferences = this.getActivity().getSharedPreferences("pref", Context.MODE_PRIVATE);

这是我的完整代码:

public class PreferencesActivity扩展AppCompatActivity {

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);


    getFragmentManager()
            .beginTransaction()
            .replace(android.R.id.content, new PreferencesScreen())
            .commit();

    ActionBar toolbar = getSupportActionBar();
    if (toolbar != null) {
        toolbar.setDisplayHomeAsUpEnabled(true);
    }
}

@Override
public boolean onOptionsItemSelected(MenuItem item) {
    if (item.getItemId() == android.R.id.home) {
        onBackPressed();
    }
    return super.onOptionsItemSelected(item);
}

public static class PreferencesScreen extends PreferenceFragment {
    public void onCreate(Bundle savedInstanceState) {




        super.onCreate(savedInstanceState);
        addPreferencesFromResource(R.xml.settings_xml);
    }
}

}

以下是我的MAinActivity代码段

我设置默认文字主题的初始部分。

`public class MainActivity扩展了AppCompatActivity         实现NavigationView.OnNavigationItemSelectedListener {

AutoCompleteTextView mytextview;
public static String[] list;
ArrayList<String> recent = new ArrayList<String>();
public int recent_index = 0;
Menu mMenu;

@Override
protected void onCreate(Bundle savedInstanceState) {

    /*Setting default theme.*/

    SharedPreferences Sp= PreferenceManager.getDefaultSharedPreferences(getApplicationContext());
    int firstRun=Sp.getInt("firstRun",0);
    if(firstRun==0)
    {

    SharedPreferences.Editor editor=Sp.edit();
    editor.putInt("paragraphFontColor", Color.parseColor("#ffffff"));
    editor.putInt("headingFontColor",Color.parseColor("#DE5246"));
    editor.putInt("subheadingFontColor",Color.parseColor("#597d5e"));
    editor.putInt("hyperlinksFontColor",Color.parseColor("#A5D8F5"));
    editor.putInt("bodyColor",Color.parseColor("#2b2b2b"));
    editor.putString("paragraphFont","PrintClearly.otf");
    editor.putString("headingFont","PrintBold.otf");
    editor.putString("subheadingFont","PrintBold.otf");
    editor.putString("hyperlinkFont","PrintBold.otf");
    editor.putString("paragraphFontStyle","normal");
    editor.putString("headingFontStyle","normal");
    editor.putString("subheadingFontStyle","normal");
    editor.putString("hyperlinkFontStyle","normal");
    editor.putString("actionBarColor","#597d5e");
    editor.putString("paragraphFontSize","20px");
    editor.putString("headingFontSize","30px");
    editor.putString("subheadingFontSize","20px");
    editor.putString("hyperlinkFontSize","20px");
    editor.putString("firstRun",0);
    editor.commit();
  }

`