如何将defaultSharedPreferences与addPreferencesFromResource连接?

时间:2016-12-14 01:16:27

标签: android sharedpreferences

Android应用编程新手。边做边学,但有些事情看似奇怪不透明。有一个简单的应用程序使用MainActivity和带有“设置”选项的菜单。

我希望能够在一个位置设置我的版本号(app build.gradle文件)。我手动更改版本名称和内部版本号(versionCode)永久增量。

def Properties versionProps = new Properties()
def versionPropsFile = file('version.properties')
if (versionPropsFile.exists())
    versionProps.load(new FileInputStream(versionPropsFile))
def buildNum = (versionProps['BUILD_number'] ?: "0").toInteger() + 1
versionProps['BUILD_number'] = buildNum.toString()
versionProps.store(versionPropsFile.newWriter(), null)

defaultConfig {
    applicationId "com.someCorp.someApp"
    minSdkVersion 22
    targetSdkVersion 25
    versionCode buildNum
    versionName "0.2.7"
}

在我的应用中,我得到了versionCodeversionName,我将后者分解为我的版本类中的Major,Minor和Release。

 PackageInfo packageInfo = getPackageManager ().getPackageInfo (getPackageName (), 0);
    int versionBuild = packageInfo.versionCode;
    String versionName = packageInfo.versionName;
    myVersion = new Version (versionBuild, versionName);

myversion.toString ()生成

  

someApp Version 0.2.7.267 \ nMajor Version 0,Minor Version 2,Release 7,Build 267   我这样做是因为即使是天真的用户也能够告诉我他们在获得不可避免的支持电话时确切地使用了哪个版本/版本。

然后我可以使用defaultSharedPreferences保存此String并检索它。

但是,当我使用推荐的方式执行“设置/首选项”菜单项时,使用现代PreferenceActivity方式启动PreferenceFragment的子类,如下所示...

    public boolean onOptionsItemSelected (MenuItem item) {
      switch (item.getItemId ()) {
         case R.id.menu_settings_item:
            Intent i = new Intent (this, someAppPreferenceActivity.class);
            startActivityForResult (i, RESULT_SETTINGS);
            break;

.

    public class someAppPreferenceActivity extends PreferenceActivity {

    public void onCreate (Bundle savedInstanceState) {
      super.onCreate (savedInstanceState);
      getFragmentManager ().beginTransaction ().replace (android.R.id.content, new MyPreferenceFragment ()).commit ();
    } // OnCreate (Bundle)

    public static class MyPreferenceFragment extends PreferenceFragment {

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

   } // class MyPreferenceFragment

...“设置”视图显示我的“settings.xml”资源文件中的设置(自然地):

<?xml version="1.0" encoding="utf-8"?>
    <PreferenceScreen xmlns:android="http://schemas.android.com/apk/res/android">
        <Preference
            android:key="pref_version"
            android:title="@string/pref_version"
            android:summary="@string/pref_version_summ"
            android:defaultValue="true" />
    </PreferenceScreen>

和s trings.xm l有

    <string name="pref_version">someApp Version 0.1.1.18\n   Major version 0\n   Minor version 1\n   Release 1\n   Build 18</string>

这是一个伪造的字符串,意图用实际值覆盖。

我的问题:

如何将我保存的SharedPreferences(隐藏)文件中保存的更改(无论在哪里)显示在settings.xml中,以便它们显示在“设置”视图中?如果我可以直接保存到SharedPreferences或设置视图,我可以跳过settings.xml步骤。

我做了很多搜索,但似乎没有办法连接这两者。示例和教程解释了两种操作方式,但没有解释如何连接它们(获取保存的首选项以显示在“设置”菜单中)。

http://www.101apps.co.za/index.php/articles/preference-settings.html

http://viralpatel.net/blogs/android-preferences-activity-example /

https://developer.android.com/reference/android/preference/PreferenceActivity.html

我无法找到访问PreferencesFromResource的方法,以便在将值添加到“设置”视图之前更改该值。从理论上讲,我应该能够逐步完成片段并更改片段并将其显示在视图中,但我找不到逐步完成片段的方法。 SharedPreferences有一个可行的键值对系统。

我找不到像PreferenceFragment.setValue (String key, String value)edit()这样的内容。

例如,此问题How to get a preference value in preference fragment的答案在片段中得到SharedPreferences,但并未真正回答如何将其与“设置”视图结合起来的问题。我可以阅读并查看保存的SharedPreferences值,但是如何将其粘贴到Fragments的层次结构中或将其添加到Settings视图中?

1 个答案:

答案 0 :(得分:0)

感谢大家的关注。

在阅读了几天的许多例子并进行了多次实验并结束我的智慧并发布问题之后,我可能突然找到了答案(在发布问题之后)。但它有点不透明,不直观。

在Fragment&#39; onCreate中,我尝试了这个:

     addPreferencesFromResource (R.xml.settings);
     Preference myPref = findPreference ("pref_version");
     myPref.setTitle (MainActivity.myVersion.toString ());

......它似乎有效。真是一种解脱!

setTitle对我来说并不直观,因为SharedPreferences总是讨论&#34; value-key&#34;,但我重新阅读了一个教程,尽管有类似的东西(setSummary)在另一种类型代码(Headers),它以某种方式让我找到了原来的setTitle

(不要知道发布我的&#34;自我回答&#34;以这种方式或者#34;接受&#34;在一段时间后它是否是正确的。)