Wie kann ich einen Wert von einem Präferenzbildschirm dauerhaft speichern?
-
27-10-2019 - |
Frage
Ich bin ein Neuling in Android und versuche nur, eine Schnur dauerhaft zu speichern.
Ich möchte diese Zeichenfolge von einem bekommen PreferenceActivity
und dann den Text von a aktualisieren TextView
.
Ich habe über die verfügbaren Optionen für anhaltenden Speicher gelesen: http://developer.android.com/guide/topics/data/data-storage.html#pref
Ich habe versucht zu benutzen SharedPreferences
Aber es ist sehr unklar für mich, wie es funktionieren sollte.
Ich habe eine sehr einfache Test -App erstellt.
MainActivity.java
public class MainActivity extends Activity {
/** Called when the activity is first created. */
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
}
/* method that starts preferences */
public void openPreferences(View v) {
Intent i = new Intent(this, Preferences.class);
startActivity(i);
}
@Override
protected void onStart(){
super.onStart();
// Get preferences
SharedPreferences preferences = getPreferences(0);
String name = preferences.getString("name","Empty string!");
// Create a RemoteViews layout
RemoteViews views = new RemoteViews(getPackageName(),R.layout.main);
// set new text for labels
views.setTextViewText(R.string.name, name);
}
@Override
protected void onStop(){
super.onStop();
// We need an Editor object to make preference changes.
// All objects are from android.context.Context
SharedPreferences preferences = getPreferences(0);
SharedPreferences.Editor editor = preferences.edit();
editor.putString("name", "This is a test");
// Commit the edits!
editor.commit();
}
}
Vorlieben.java
public class Preferences extends PreferenceActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
addPreferencesFromResource(R.xml.preferences);
}
}
AndroidManifest.xml
<application android:icon="@drawable/icon" android:label="@string/app_name">
<activity android:name=".MainActivity"
android:label="@string/app_name">
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
<activity android:name=".Preferences"
android:label="@string/preferences_title">
</activity>
</application>
Der Text der TextView
Niemals ändert sich es, es wird immer auf den Wert eingestellt, den ich auf Strings.xml gesetzt habe.
Können Sie mir bitte helfen zu verstehen, was ich falsch mache?
Vielen Dank.
Lösung
Sie sind sehr nahe an dem, was ich empfehlen würde:
1) Definieren Sie einige gemeinsame Vorlieben:
public static final String MY_PREFERENCES = "MyPreferences";
...
public static final SOME_PREFERENCE = "SomePreference";
2) Lesen Sie aus gemeinsamen Vorlieben
SharedPreferences myPreferences;
...
myPreferences = getSharedPreferences (MY_PREFERENCES, Context.MODE_PRIVATE);
3) Speichern/Aktualisieren einer gemeinsam genutzten Einstellungen:
Editor editor = myPreferences.edit ();
editor.putString (SOME_PREFERENCE, "abc");
editor.commit ();
Andere Tipps
Schnelles Beispiel für das Speichern/Schreiben von Benutzernamen, Passwort in Einstellungen.
SharedPreferences preferences = PreferenceManager.getDefaultSharedPreferences(this);
Editor edit = preferences.edit();
edit.putString("username", "abcd");
edit.putString("password", "abcd#");
edit.commit();
Schnelles Beispiel für das Lesen von Benutzernamen, Passwort aus den Einstellungen.
SharedPreferences preferences = PreferenceManager.getDefaultSharedPreferences(this);
String strUsername = preferences.getString("username", null);
String strPassword = preferences.getString("password", null);
Ich habe gerade meinen Code im Zusammenhang mit dem Zusammenhang mit SharedPreferences
ist richtig, aber die TextView
Aktualisiert niemals, weil ich versucht habe, die Zeichenfolge selbst direkt zu bearbeiten, nicht die TextView
!
Einfach auf diese Weise gelöst:
/* Update text of TextView */
TextView t = (TextView) this.findViewById(R.id.name);
// previously was R.string.name - not correct!
t.setText(name);
Vielen Dank für deine Hilfe Jungs :)