2013-07-24 111 views
1

我想从XML中获取偏好,但不使用PreferenceActivity。 我只想在创建主活动时从文件加载并从首选项中烘烤一个值。但问题是吐司是空的(空?)。我有一个加载首选项的类。用PreferenceManager从XML设置偏好设置

这里的主要活动

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

    Preferences prefs = new Preferences(); 
} 

Preferences类的onCreate方法(只构造...)

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)设置值。

你知道什么可能是错的吗? 谢谢

+0

你应该将Preferences类调用为'Preferences prefs = new Preferences(this);' – Dulanga

+0

我试过但没有改变任何东西。 –

回答

1

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

我会给你一个快速和完整的教程,让你进入这个问题。我真的推荐你使用这种方法,因为大多数程序员都这样做。

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

开始。

将一个文件config.properties到资产的文件夹:config.properties的 enter image description here

样品

[email protected] 
errorTextColor=\#FF0000 
serverPort=1234 

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

公共静态字符串数据getConfigurationPropertiesValue(字符串值, 上下文上下文)尝试{ 资源资源= cont ext.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的位置。

为了使用它,你需要创建你的数据。你只需要做一次。或更多,如果用户决定他有一个冲动来清除设置 - >应用程序中的应用程序数据。

创建数据:

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

Accesing现有数据:

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

因为,如果存在的数据或将检查的机构,如果用户删除它你可以使用一些简单的东西,比如一个附加变量,如果所有y都应该是真的我们的数据已配置。或者应该有一个来自appshared首选项的检查方法。

干杯!

+0

谢谢,我按照你说的方式行事,效果很好! –

+0

我可以直接从手机的文件管理器访问文件config.properties吗?它位于哪里? (我的意思是apk中的其他位置) –

+0

我不这么认为。您可能无法通过文件管理器访问它,因为它被打包到安装中。 Config.properties文件适用于永远不会更改且不变的数据。如果你想获得一些方法来轻松地从android数据库获取数据并更改它,你正在寻找“android sharedPreferences”。它就像一个config.properties,但你可以在那里改变数据。如果你愿意,我会给你从我的代码完整的例子。 –

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>