【问题标题】:Android set preferences from XML with PreferenceManagerAndroid 使用 PreferenceManager 从 XML 设置首选项
【发布时间】:2013-07-24 06:23:41
【问题描述】:

我正在尝试从 XML 中获取首选项,但不使用 PreferenceActivity。 我只想在创建主要活动时从文件中加载并从首选项中获取一个值。但问题是吐司是空的(null?)。我有一个加载首选项的类。

这里是主Activity的onCreate方法

protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);

    Preferences prefs = new Preferences();
}

Preferences 类(仅构造函数...)

public Preferences(Context context) {
    PreferenceManager.setDefaultValues(context, "MyPrefs", 0, R.xml.preferences, false);
    SharedPreferences sharedPreferences = context.getSharedPreferences("MyPrefs", 0);
    Editor editor = sharedPreferences.edit();
    String myValue = sharedPreferences.getString("myKey", null); // I don't know if null is OK
    Toast.makeText(context.getApplicationContext(), myValue, Toast.LENGTH_SHORT).show();
}

还有 XML 文件

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

第一次启动应用程序时,我希望设置默认值。所以在这里我希望应用程序在我没有使用 editor.putString(key, value) 设置值的情况下祝酒“你好”。

你知道可能出了什么问题吗? 谢谢

【问题讨论】:

  • 您应该将 Preferences 类称为 'Preferences prefs = new Preferences(this);'
  • 我试过但没有改变任何东西。

标签: android xml sharedpreferences


【解决方案1】:

你正在用java编程。按照太阳的惯例,我认为你有义务使用 config.propeties 文件。

我将提供一个快速而完整的教程来帮助您解决这个问题。我真的推荐你使用这种方法,因为大多数程序员都这样做。

我会给你一个快速教程如何制作这个文件。放在哪里。以及如何从中获取数据。

开始。

将文件 config.properties 放入 assets 文件夹:

config.properties 示例

domain=@domain.com.pl
errorTextColor=\#FF0000
serverPort=1234

方法如何从 config.properties 访问和检索数据

public static String getConfigurationPropertiesValue(String value, 上下文上下文){ 尝试 { 资源资源 = context.getResources(); AssetManagerassetManager = resources.getAssets();

     try {
        InputStream inputStream = assetManager.open("config.properties");
        Properties properties = new Properties();
        properties.load(inputStream);
        return properties.getProperty(value);
     } catch (IOException e) {
        Log.e("getConfigurationPropertiesValue",
              "Failed to open config property file");
     }
  } catch (Exception e) {
     e.printStackTrace();
  }
  return null;

}

文学: http://en.wikipedia.org/wiki/.properties http://www.mkyong.com/java/java-properties-file-examples/

编辑:

您还可以使用 sharedPreferences 来更好地控制数据,例如添加数据/删除数据/更新数据。 SharedPreferences 更像是一个 Android 的 SQLite 数据库,有一个很好的 api 可以使用,所以你不需要知道数据库或 SQL 的位置。

为了使用它,您需要创建数据。您只需执行一次。 或者更多,如果用户决定他有从设置 -> 应用程序中清理您的应用程序数据的冲动。

创建数据:

   public static void create(Context cw) {
      SharedPreferences sharedPreferences = cw.getSharedPreferences(
            ANDROID_MESSENGER, Activity.MODE_PRIVATE);
      SharedPreferences.Editor editor = sharedPreferences.edit();
      editor.putBoolean("isRegistered", false);
      editor.putString("phoneNumber", null);
      editor.putString("callingCode", null);
      String uuid = UUID.randomUUID().toString();
      editor.putString("token", uuid);

      editor.putBoolean("internetOnly", false);
      editor.putBoolean("logToDev", true);
      editor.putBoolean("dataTransfer", true);
      Log.i("create", "Generating Token: " + uuid);
      editor.commit();
   }

访问现有数据:

   public static String getToken(Context cw) {
      SharedPreferences sharedPreferences = cw.getSharedPreferences(
            ANDROID_MESSENGER, Activity.MODE_PRIVATE);
      return sharedPreferences.getString("token", null);
   }

更新数据:

   public static void setPhoneNumber(Context cw, String phoneNumber) {
      SharedPreferences sharedPreferences = cw.getSharedPreferences(
            ANDROID_MESSENGER, Activity.MODE_PRIVATE);
      SharedPreferences.Editor editor = sharedPreferences.edit();
      editor.putString("phoneNumber", phoneNumber);
      editor.commit();
   }

对于检查数据是否存在或用户是否已删除数据的机制,您可以使用一些简单的东西,例如一个附加变量,如果您的所有数据都已配置,则该变量应该为真。或者应该有一个来自应用共享偏好的检查方法。

干杯!

【讨论】:

  • 我可以直接从手机的文件管理器访问文件config.properties吗?它位于哪里? (我的意思是apk中的其他位置)
  • 我不这么认为。您可能无法通过文件管理器访问它,因为它已打包到安装中。 Config.properties 文件用于永远不会更改且恒定的数据。如果您想获得一些方法来轻松地从 android 数据库中获取数据并对其进行更改,那么您正在寻找“android sharedPreferences”。它类似于 config.properties,但您可以在那里更改数据。如果你愿意,我会从我的代码中给你完整的例子。
  • 是的,我对您的代码感兴趣。我真的是初学者,任何例子都可能非常实用。谢谢
  • 我会在几分钟后编辑我的原始帖子,再给你一个例子。
  • 花时间帮忙真是太好了。感谢您提供上面的代码,我会注意并尝试正确使用它!
【解决方案2】:

我尝试了很长时间并找到了解决方案:-) android无法识别“首选项”。虽然我不知道为什么。

如果您将其更改为“EditTextPreference”或“CheckboxPreference”之类的任何标签,则它可以正常工作。

<?xml version="1.0" encoding="utf-8"?>
<PreferenceScreen xmlns:android="http://schemas.android.com/apk/res/android" >
    <EditTextPreference android:key="CLIENT_HOMESCREEN_TITLE"
                android:defaultValue="Home Screen"/>
    <EditTextPreference android:key="CLIENT_ADMIN_BUTTON"
                android:defaultValue="Admin"/>
    <EditTextPreference android:key="CLIENT_PLAYER_BUTTON"
                android:defaultValue="Player"/>
    <EditTextPreference android:key="CLIENT_SAVE_BUTTON"
                android:defaultValue="Save"/>
    <EditTextPreference android:key="CLIENT_CANCEL_BUTTON"
                android:defaultValue="Cancel"/>
    <EditTextPreference android:key="CLIENT_SERVER_SETUP_IP"
                android:defaultValue="IP:"/>
    <EditTextPreference android:key="CLIENT_SERVER_SETUP_PORT"
                android:defaultValue="Port:"/>
    <EditTextPreference android:key="CLIENT_SERVER_SETUP_TITLE"
                android:defaultValue="Server Setup"/>
</PreferenceScreen>

【讨论】:

    猜你喜欢
    • 2011-07-02
    • 1970-01-01
    • 2014-10-10
    • 1970-01-01
    • 1970-01-01
    • 2014-10-26
    • 1970-01-01
    • 1970-01-01
    • 2016-08-14
    相关资源
    最近更新 更多