Gemeinsame Einstellungen für Android zum Erstellen einer einmaligen Aktivität (Beispiel) [geschlossen]

295

Ich habe drei Aktivitäten A, B und C, wobei A und B Formulare sind und nach dem Ausfüllen und Speichern der Formulardaten in der Datenbank (SQLITE). Ich verwende die Absicht von A nach B und dann von B nach C. Ich möchte, dass ich jedes Mal, wenn ich meine App öffne, C als Startbildschirm und nicht mehr A und B möchte.

Ich denke, gemeinsame Einstellungen würden dafür funktionieren, aber ich kann kein gutes Beispiel finden, um mir einen Startplatz zu geben. Jede Hilfe wäre dankbar.

user3104719
quelle
10
Verwenden freigegebener Einstellungen von der Android-Entwicklungssite.
Onik
1
Haben Sie sich das offizielle Tutorial unter developer.android.com/guide/topics/data/data-storage.html#pref angesehen ?
AxiomaticNexus
12
Ich stimme dafür, diese Frage erneut zu öffnen, weil sie nicht wirklich nach einer Empfehlung fragt.
Suragch

Antworten:

620

Einstellen von Werten in den Einstellungen:

// MY_PREFS_NAME - a static String variable like: 
//public static final String MY_PREFS_NAME = "MyPrefsFile";
SharedPreferences.Editor editor = getSharedPreferences(MY_PREFS_NAME, MODE_PRIVATE).edit();
 editor.putString("name", "Elena");
 editor.putInt("idName", 12);
 editor.apply();

Daten von Präferenz abrufen:

SharedPreferences prefs = getSharedPreferences(MY_PREFS_NAME, MODE_PRIVATE); 
String name = prefs.getString("name", "No name defined");//"No name defined" is the default value.
int idName = prefs.getInt("idName", 0); //0 is the default value.

Mehr Info:

Gemeinsame Einstellungen verwenden

Gemeinsame Einstellungen

Jorgesys
quelle
74
Verwenden Sie stattdessen apply (). Commit schreibt seine Daten sofort in den persistenten Speicher, während Apply sie im Hintergrund behandelt.
CodeNinja
12
apply()ist ein asynchroner Aufruf zum Ausführen von Festplatten-E / A, wobei as commit()synchron ist. Vermeiden Sie es daher, commit()vom UI-Thread aus aufzurufen .
Aniket Thakur
103

Erstellen Sie SharedPreferences

SharedPreferences pref = getApplicationContext().getSharedPreferences("MyPref", MODE_PRIVATE); 
Editor editor = pref.edit();

Speichern von Daten als KEY / VALUE-Paar

editor.putBoolean("key_name1", true);           // Saving boolean - true/false
editor.putInt("key_name2", "int value");        // Saving integer
editor.putFloat("key_name3", "float value");    // Saving float
editor.putLong("key_name4", "long value");      // Saving long
editor.putString("key_name5", "string value");  // Saving string

// Save the changes in SharedPreferences
editor.apply(); // commit changes

SharedPreferences-Daten abrufen

// Wenn der Wert für den Schlüssel nicht vorhanden ist, wird der zweite Parameterwert zurückgegeben - In diesem Fall null

boolean userFirstLogin= pref.getBoolean("key_name1", true);  // getting boolean
int pageNumber=pref.getInt("key_name2", 0);             // getting Integer
float amount=pref.getFloat("key_name3", null);          // getting Float
long distance=pref.getLong("key_name4", null);          // getting Long
String email=pref.getString("key_name5", null);         // getting String

Löschen des Schlüsselwerts aus SharedPreferences

editor.remove("key_name3"); // will delete key key_name3
editor.remove("key_name4"); // will delete key key_name4

// Save the changes in SharedPreferences
editor.apply(); // commit changes

Löschen Sie alle Daten aus SharedPreferences

 editor.clear();
 editor.apply(); // commit changes
Krausz Lóránt Szilveszter
quelle
3
pref.getBoolean ("key_name1", null); es kann nicht null sein. Es benötigt einen Defalut-Wert, wenn nichts gespeichert ist.
Boris Karloff
2
Verwenden Sie besser apply () anstelle von commit (). apply () ist asynchron und Sie werden es auf einem Hintergrund-Thread ausführen
Androider
Stürzt ab, wenn Schlüsselname3 oder Schlüsselname4 null sind
TacB0sS
1
Ich habe eine Registrierungsseite, auf der Benutzerinformationen gespeichert sind, und eine Anmeldeseite, auf der sich der Benutzer mit diesen Informationen anmeldet. Ich habe zwei Klassen, ich nehme Informationen einer Klasse und ich möchte diese Informationen einer anderen Klasse verwenden. Wenn ich den obigen Code in meinem Code verwende. Ich nehme eine Nullzeigerausnahme. Gibt es eine Verwendung wie ich? @ KrauszLórántSzilveszter
ZpCikTi
43

Wie initialisiere ich?

// 0 - for private mode`
SharedPreferences pref = getApplicationContext().getSharedPreferences("MyPref", 0); 

Editor editor = pref.edit();

Wie speichere ich Daten in gemeinsamen Einstellungen?

editor.putString("key_name", "string value"); // Storing string

ODER

editor.putInt("key_name", "int value"); //Storing integer

Und vergessen Sie nicht, sich zu bewerben:

editor.apply();

Wie rufe ich Daten aus freigegebenen Einstellungen ab?

pref.getString("key_name", null); // getting String

pref.getInt("key_name", 0); // getting Integer

Hoffe das wird dir helfen :)

Omi Sparky
quelle
Die Initialisierung ist wichtig, wenn Sie auf eine Aktivität, ein Fragment oder eine öffentliche Klasse
zugreifen
19

Sie können Ihre benutzerdefinierte SharedPreference-Klasse erstellen

public class YourPreference {   
    private static YourPreference yourPreference;
    private SharedPreferences sharedPreferences;

    public static YourPreference getInstance(Context context) {
        if (yourPreference == null) {
            yourPreference = new YourPreference(context);
        }
        return yourPreference;
    }

    private YourPreference(Context context) {
        sharedPreferences = context.getSharedPreferences("YourCustomNamedPreference",Context.MODE_PRIVATE);
    }

    public void saveData(String key,String value) {
        SharedPreferences.Editor prefsEditor = sharedPreferences.edit();
        prefsEditor .putString(key, value);
        prefsEditor.commit();           
    }

    public String getData(String key) {
        if (sharedPreferences!= null) {
           return sharedPreferences.getString(key, "");
        }
        return "";         
    }
}

Sie können Ihre YourPrefrence-Instanz wie folgt erhalten:

YourPreference yourPrefrence = YourPreference.getInstance(context);
yourPreference.saveData(YOUR_KEY,YOUR_VALUE);

String value = yourPreference.getData(YOUR_KEY);
Rahul Parihar
quelle
1
String value = yourPreference.getData (YOUR_KEY); Fehler: Nicht statischer Inhalt kann nicht im statischen Kontext referenziert werden
Jana Babu
Die Instanz von Context hat mir null gegeben, also habe ich sharedPreferences = context.getSharedPreferences ("YourCustomNamedPreference", Context.MODE_PRIVATE) eingegeben. Diese Zeile in try catch block und seine Arbeit, aber die Sache ist, warum es null gibt?
Ionic
Ich verwende diese Klasse in meinem Projekt und initiiere meine gemeinsamen Einstellungen in BaseActivity und verwende sie in anderen Aktivitäten (splashScreen & Login & Hauptaktivität), um den Anmeldestatus des Benutzers zu überprüfen und die App zu verlassen. Aber das funktioniert nicht für Android 8 zum Beenden! Hast du irgendwelche Vorschläge?
Rogayeh Hosseini
17

Ich fand alle obigen Beispiele einfach zu verwirrend, also schrieb ich meine eigenen. Codefragmente sind in Ordnung, wenn Sie wissen, was Sie tun, aber was ist mit Leuten wie mir, die das nicht tun?

Möchten Sie stattdessen eine Cut-n-Paste-Lösung? Na hier ist es!

Erstellen Sie eine neue Java-Datei und nennen Sie sie Keystore. Fügen Sie dann diesen Code ein:

import android.content.Context;
import android.content.SharedPreferences;
import android.content.SharedPreferences.Editor;
import android.util.Log;

public class Keystore { //Did you remember to vote up my example?
    private static Keystore store;
    private SharedPreferences SP;
    private static String filename="Keys";

private Keystore(Context context) {
    SP = context.getApplicationContext().getSharedPreferences(filename,0);
}

public static Keystore getInstance(Context context) {
    if (store == null) {
        Log.v("Keystore","NEW STORE");
        store = new Keystore(context);
    }
    return store;
}

public void put(String key, String value) {//Log.v("Keystore","PUT "+key+" "+value);
    Editor editor = SP.edit();
    editor.putString(key, value);
    editor.commit(); // Stop everything and do an immediate save!
    // editor.apply();//Keep going and save when you are not busy - Available only in APIs 9 and above.  This is the preferred way of saving.
}

public String get(String key) {//Log.v("Keystore","GET from "+key);
    return SP.getString(key, null);

}

public int getInt(String key) {//Log.v("Keystore","GET INT from "+key);
    return SP.getInt(key, 0);
}

public void putInt(String key, int num) {//Log.v("Keystore","PUT INT "+key+" "+String.valueOf(num));
    Editor editor = SP.edit();

    editor.putInt(key, num);
    editor.commit();
}


public void clear(){ // Delete all shared preferences
    Editor editor = SP.edit();

    editor.clear();
    editor.commit();
}

public void remove(){ // Delete only the shared preference that you want
    Editor editor = SP.edit();

    editor.remove(filename);
    editor.commit();
}
}

Speichern Sie nun diese Datei und vergessen Sie sie. Du bist damit fertig. Gehen Sie jetzt zurück zu Ihrer Aktivität und verwenden Sie sie wie folgt:

public class YourClass extends Activity{

private Keystore store;//Holds our key pairs

public YourSub(Context context){
    store = Keystore.getInstance(context);//Creates or Gets our key pairs.  You MUST have access to current context!

    int= store.getInt("key name to get int value");
    string = store.get("key name to get string value");

    store.putInt("key name to store int value",int_var);
    store.put("key name to store string value",string_var);
    }
}
RM
quelle
Ich verwende diese Klasse in meinem Projekt und initiiere meine gemeinsamen Einstellungen in BaseActivity und verwende sie in anderen Aktivitäten (splashScreen & Login & Hauptaktivität), um den Anmeldestatus des Benutzers zu überprüfen und die App zu verlassen. Aber das funktioniert nicht für Android 8 zum Beenden! Hast du irgendwelche Vorschläge?
Rogayeh Hosseini
15

Shared Preferencessind XML-Dateien zum Speichern privater primitiver Daten in Schlüssel-Wert-Paaren. Zu den Datentypen gehören Boolesche Werte , Floats , Ints , Longs und Strings .

Wenn Sie einige Daten speichern möchten, auf die in der gesamten Anwendung zugegriffen werden kann, können Sie sie in einer globalen Variablen speichern. Es verschwindet jedoch, sobald die Anwendung geschlossen wird. Eine andere und empfohlene Möglichkeit ist das Speichern in SharedPreference. In der SharedPreferences-Datei gespeicherte Daten sind in der gesamten Anwendung verfügbar und bleiben auch nach dem Schließen der Anwendung oder nach einem Neustart erhalten.

SharedPreferences speichert die Daten im Schlüssel-Wert-Paar und kann auf dieselbe Weise aufgerufen werden.

Sie können ein Objekt SharedPreferencesmit zwei Methoden erstellen :

1). getSharedPreferences () : Mit diesen Methoden können Sie mehrere SharedPreferences.and seine ersten Parameter im Namen von erstellen SharedPreferences.

2). getPreferences () : Mit dieser Methode können Sie Single erstellen SharedPreferences.

Daten speichern

Hinzufügen einer Variablendeklaration / Erstellen einer Voreinstellungsdatei

public static final String PREFERENCES_FILE_NAME = "MyAppPreferences";

Rufen Sie ein Handle zum Dateinamen ab (mithilfe von getSharedPreferences).

SharedPreferences settingsfile= getSharedPreferences(PREFERENCES_FILE_NAME,0);

Öffnen Sie den Editor und fügen Sie Schlüssel-Wert-Paare hinzu

SharedPreferences.Editor myeditor = settingsfile.edit(); 
myeditor.putBoolean("IITAMIYO", true); 
myeditor.putFloat("VOLUME", 0.7)
myeditor.putInt("BORDER", 2)
myeditor.putLong("SIZE", 12345678910L)
myeditor.putString("Name", "Amiyo")
myeditor.apply(); 

Vergessen Sie nicht, myeditor.apply()wie oben gezeigt anzuwenden / zu speichern .

Daten abrufen

 SharedPreferences mysettings= getSharedPreferences(PREFERENCES_FILE_NAME, 0);
IITAMIYO = mysettings.getBoolean("IITAMIYO", false); 
//returns value for the given key. 
//second parameter gives the default value if no user preference found
// (set to false in above case)
VOLUME = mysettings.getFloat("VOLUME", 0.5) 
//0.5 being the default value if no volume preferences found
// and similarly there are get methods for other data types
IntelliJ Amiya
quelle
13
public class Preferences {

public static final String PREF_NAME = "your preferences name";

@SuppressWarnings("deprecation")
public static final int MODE = Context.MODE_WORLD_WRITEABLE;

public static final String USER_ID = "USER_ID_NEW";
public static final String USER_NAME = "USER_NAME";

public static final String NAME = "NAME";
public static final String EMAIL = "EMAIL";
public static final String PHONE = "PHONE";
public static final String address = "address";

public static void writeBoolean(Context context, String key, boolean value) {
    getEditor(context).putBoolean(key, value).commit();
}

public static boolean readBoolean(Context context, String key,
        boolean defValue) {
    return getPreferences(context).getBoolean(key, defValue);
}

public static void writeInteger(Context context, String key, int value) {
    getEditor(context).putInt(key, value).commit();

}

public static int readInteger(Context context, String key, int defValue) {
    return getPreferences(context).getInt(key, defValue);
}

public static void writeString(Context context, String key, String value) {
    getEditor(context).putString(key, value).commit();

}

public static String readString(Context context, String key, String defValue) {
    return getPreferences(context).getString(key, defValue);
}

public static void writeFloat(Context context, String key, float value) {
    getEditor(context).putFloat(key, value).commit();
}

public static float readFloat(Context context, String key, float defValue) {
    return getPreferences(context).getFloat(key, defValue);
}

public static void writeLong(Context context, String key, long value) {
    getEditor(context).putLong(key, value).commit();
}

public static long readLong(Context context, String key, long defValue) {
    return getPreferences(context).getLong(key, defValue);
}

public static SharedPreferences getPreferences(Context context) {
    return context.getSharedPreferences(PREF_NAME, MODE);
}

public static Editor getEditor(Context context) {
    return getPreferences(context).edit();
}

}

**** Verwenden Sie die Einstellungen, um einen Wert zu schreiben, indem Sie: - ****

Preferences.writeString(getApplicationContext(),
                    Preferences.NAME, "dev");

**** Verwenden Sie die Einstellungen, um den Wert zu lesen, indem Sie: - ****

Preferences.readString(getApplicationContext(), Preferences.NAME,
                    "");
smit modi
quelle
7

Der beste Weg zum Erstellen SharedPreferenceund für die globale Verwendung müssen Sie eine Klasse wie folgt erstellen:

public class PreferenceHelperDemo {
    private final SharedPreferences mPrefs;

    public PreferenceHelperDemo(Context context) {
        mPrefs = PreferenceManager.getDefaultSharedPreferences(context);
    }

    private String PREF_Key= "Key";

    public String getKey() {
        String str = mPrefs.getString(PREF_Key, "");
        return str;
    }

    public void setKey(String pREF_Key) {
        Editor mEditor = mPrefs.edit();
        mEditor.putString(PREF_Key, pREF_Key);
        mEditor.apply();
    }

}
varotariya vajsi
quelle
PreferenceManager.getDefaultSharedPreferences ist veraltet
Guy4444
4
SharedPreferences mPref;
SharedPreferences.Editor editor;

public SharedPrefrences(Context mContext) {
    mPref = mContext.getSharedPreferences(Constant.SharedPreferences, Context.MODE_PRIVATE);
    editor=mPref.edit();
}

public void setLocation(String latitude, String longitude) {
    SharedPreferences.Editor editor = mPref.edit();
    editor.putString("latitude", latitude);
    editor.putString("longitude", longitude);
    editor.apply();
}

public String getLatitude() {
    return mPref.getString("latitude", "");
}

public String getLongitude() {
    return mPref.getString("longitude", "");
}

public void setGCM(String gcm_id, String device_id) {
     editor.putString("gcm_id", gcm_id);
    editor.putString("device_id", device_id);
    editor.apply();
}

public String getGCMId() {
    return mPref.getString("gcm_id", "");
}

public String getDeviceId() {
    return mPref.getString("device_id", "");
}


public void setUserData(User user){

    Gson gson = new Gson();
    String json = gson.toJson(user);
    editor.putString("user", json);
    editor.apply();
}
public User getUserData(){
    Gson gson = new Gson();
    String json = mPref.getString("user", "");
    User user = gson.fromJson(json, User.class);
    return user;
}

public void setSocialMediaStatus(SocialMedialStatus status){

    Gson gson = new Gson();
    String json = gson.toJson(status);
    editor.putString("status", json);
    editor.apply();
}
public SocialMedialStatus getSocialMediaStatus(){
    Gson gson = new Gson();
    String json = mPref.getString("status", "");
    SocialMedialStatus status = gson.fromJson(json, SocialMedialStatus.class);
    return status;
}
CHirag RAmi
quelle
3

Schreiben Sie in die freigegebenen Einstellungen

SharedPreferences sharedPref = getActivity().getPreferences(Context.MODE_PRIVATE);
SharedPreferences.Editor editor = sharedPref.edit();
editor.putInt(getString(R.string.saved_high_score), newHighScore);
 editor.commit(); 

Lesen Sie aus den freigegebenen Einstellungen

SharedPreferences sharedPref = getActivity().getPreferences(Context.MODE_PRIVATE);
int defaultValue = getResources().getInteger(R.string.saved_high_score_default);
long highScore = sharedPref.getInt(getString(R.string.saved_high_score), defaultValue);
Syed Junaid
quelle
Verwenden Sie getSharedPreferences ("MyPref", MODE_PRIVATE). anstelle von: getPreferences (Context.MODE_PRIVATE); Weil die Daten nur für die Aktivität gültig sind, an der Sie teilnehmen. Dies liegt daran, dass in dieser Aktivität der Dateiname auf dem Aktivitätsnamen steht. Wenn Sie diese Einstellungen von einer anderen Aktivität aus aufrufen, sind die Daten unterschiedlich.
Guy4444
0
Initialise here..
 SharedPreferences msharedpref = getSharedPreferences("msh",
                    MODE_PRIVATE);
            Editor editor = msharedpref.edit();

store data...
editor.putString("id",uida); //uida is your string to be stored
editor.commit();
finish();


fetch...
SharedPreferences prefs = this.getSharedPreferences("msh", Context.MODE_PRIVATE);
        uida = prefs.getString("id", "");
shweta c
quelle
0
SharedPreferences sharedPref = getActivity().getPreferences(Context.MODE_PRIVATE);
SharedPreferences.Editor editor = sharedPref.edit();
editor.putInt(getString(R.string.saved_high_score), newHighScore);
editor.commit();
Syed Junaid
quelle
3
Willkommen bei Stack Overflow! Bitte erläutern Sie, wie Sie den von Ihnen angegebenen Code verwenden und warum er funktioniert. Vielen Dank!
Intcreator
0

Sie können sich auch ein früheres Beispielprojekt von mir ansehen , das zu diesem Zweck geschrieben wurde. Ich speichere lokal einen Namen und rufe ihn entweder auf Anfrage eines Benutzers oder beim Start der App ab.

Zu diesem Zeitpunkt ist es jedoch besser , die Daten commit(anstelle apply) zum Speichern zu verwenden. Mehr Infos hier .

Thodorisbais
quelle
0
        // Create object of SharedPreferences.
        SharedPreferences sharedPref = getSharedPreferences("mypref", 0);

        //now get Editor
        SharedPreferences.Editor editor = sharedPref.edit();

        //put your value
        editor.putString("name", required_Text);

        //commits your edits
        editor.commit();

       // Its used to retrieve data
       SharedPreferences sharedPref = getSharedPreferences("mypref", 0);
       String name = sharedPref.getString("name", "");

       if (name.equalsIgnoreCase("required_Text")) {
          Log.v("Matched","Required Text Matched");
          } else {
               Log.v("Not Matched","Required Text Not Matched"); 
                 }
Nadeem Abbas
quelle
0

Gemeinsame Einstellungen sind so einfach zu erlernen. Schauen Sie sich also dieses einfache Tutorial über gemeinsame Einstellungen an

import android.os.Bundle;
import android.preference.PreferenceActivity;

    public class UserSettingActivity extends PreferenceActivity {

    @Override
    public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);

      addPreferencesFromResource(R.xml.settings);

    }
}
Dondondon
quelle