Android使用PreferenceManager从XML设置首选项

时间:2013-07-24 16:28:16

标签: android xml sharedpreferences

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

以下是主要活动的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)设置值的情况下干杯“你好”。

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

2 个答案:

答案 0 :(得分:1)

你是用java编程的。通过太阳会议,我认为你有义务使用config.propeties文件。

我将提供一个快速而完整的教程,让您了解此事。我真的建议你使用这种方法,因为大多数程序员都喜欢这样。

我将为您提供如何制作此文件的快速教程。把它放在哪里。以及如何从中获取数据。

开始。

将文件config.properties放入assets文件夹: enter image description here

config.properties的示例

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

如何从config.properties

访问和检索数据的方法

public static String getConfigurationPropertiesValue(String value,          上下文上下文){       尝试{          Resources resources = context.getResources();          AssetManager assetManager = 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的位置。

要使用它,您需要创建数据。你只需要这样做一次。 或者更多,如果用户决定他有从设置中清除应用数据的冲动 - &gt;应用

创建数据:

   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();
   }

对于检查数据是否存在或用户是否删除它的机制,您可以使用简单的其他变量,如果配置了所有数据,则应该为真。或者应该有一个来自appshared首选项的检查方法。

干杯!

答案 1 :(得分:0)

我试了很久,找到了解决方案:-) 只是一个“偏好”不被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>