2013-07-24 187 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>