Tùy chọn được chia sẻ của Android để tạo hoạt động một lần (ví dụ) [đã đóng]


295

Tôi có ba hoạt động A, B và C trong đó A và B là các biểu mẫu và sau khi điền và lưu dữ liệu biểu mẫu trong cơ sở dữ liệu (SQLITE). Tôi đang sử dụng ý định từ A đến B và sau đó B đến C. Điều tôi muốn là mỗi lần mở ứng dụng, tôi muốn C là màn hình chính của mình chứ không phải A và B nữa.

Tôi đoán sở thích được chia sẻ sẽ làm việc này, nhưng tôi không thể tìm thấy một ví dụ tốt để cho tôi một nơi bắt đầu. Bất kỳ trợ giúp sẽ được đánh giá cao.


10
Sử dụng Tùy chọn chia sẻ từ trang web dev của Android.
Onik

1
Bạn đã xem hướng dẫn chính thức tại developer.android.com/guide/topics/data/data-st Storage.html # pref ?
AxiomaticNexus

12
Tôi đang bỏ phiếu để mở lại câu hỏi này vì nó không thực sự yêu cầu đề xuất.
Suragch

Câu trả lời:


620

Đặt giá trị trong Tùy chọn:

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

Lấy dữ liệu từ ưu tiên:

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.

thêm thông tin:

Sử dụng tùy chọn chia sẻ

Tùy chọn chia sẻ


74
Xem xét sử dụng áp dụng () thay thế; cam kết ghi dữ liệu của nó vào bộ lưu trữ liên tục ngay lập tức, trong khi áp dụng sẽ xử lý nó trong nền.
CodeNinja

12
apply()là cuộc gọi không đồng bộ để thực hiện I / O đĩa trong đó commit()là đồng bộ. Vì vậy, tránh gọi commit()từ luồng UI.
Aniket Thakur

103

Tạo SharedPreferences

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

Lưu trữ dữ liệu dưới dạng cặp KEY / VALUE

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

Nhận dữ liệu SharedPreferences

// Nếu giá trị cho khóa không tồn tại thì trả về giá trị param thứ hai - Trong trường hợp này là 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

Xóa giá trị khóa khỏi 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

Xóa tất cả dữ liệu khỏi SharedPreferences

 editor.clear();
 editor.apply(); // commit changes

3
pref.getBoolean ("key_name1", null); nó không thể là null Nó cần một giá trị mặc định nếu không có gì được lưu trữ.
Boris Karloff

2
Bạn nên sử dụng áp dụng () thay vì commit (). áp dụng () không đồng bộ và bạn sẽ chạy nó trên một luồng nền
Androider

Sẽ sập nếu key_name3 hoặc key_name4 không có giá trị
TacB0sS

1
Tôi có một trang đăng ký lưu trữ thông tin người dùng và tôi có một trang đăng nhập mà người dùng đăng nhập với thông tin đó. Tôi có hai lớp, tôi lấy thông tin một lớp và tôi muốn sử dụng thông tin đó lớp khác. Khi tôi sử dụng mã ở trên trong mã của mình. Tôi có ngoại lệ con trỏ null. Có cách sử dụng như tôi không? @ KrauszLórántSzilveszter
ZpCikTi

43

Làm thế nào để Intialize?

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

Editor editor = pref.edit();

Làm thế nào để lưu trữ dữ liệu trong sở thích chung?

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

HOẶC LÀ

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

Và đừng quên áp dụng:

editor.apply();

Làm thế nào để lấy dữ liệu từ tùy chọn chia sẻ?

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

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

Hy vọng điều này sẽ giúp U :)


Việc khởi tạo rất quan trọng nếu bạn truy cập vào một hoạt động, đoạn hoặc lớp công khai
DragonFire

19

Bạn có thể tạo lớp SharedPreference tùy chỉnh của mình

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 "";         
    }
}

Bạn có thể lấy ví dụ YourPrefrence như:

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

String value = yourPreference.getData(YOUR_KEY);

1
Chuỗi giá trị = yourPreference.getData (YOU_KEY); Lỗi: canot nội dung không tĩnh được giới thiệu trong bối cảnh tĩnh
Jana Babu

hi dụ của Context đã cho tôi null nên tôi đã chia sẻ sharedPreferences = bối cảnh.getSharedPreferences ("YourCustomNamedPreference", Context.MODE_PRIVATE); dòng này trong thử khối bắt và công việc của nó nhưng vấn đề là tại sao nó lại cho null?
Ionic

Tôi sử dụng lớp này trong dự án của mình và khởi tạo các cuộc chia sẻ của mình trong BaseActivity và sử dụng trong các hoạt động khác (SplashScreen & đăng nhập & hoạt động chính) để kiểm tra trạng thái đăng nhập của người dùng và thoát khỏi ứng dụng. Nhưng điều này không hoạt động cho Android 8 để thoát! Bạn có bất cứ đề nghị?
roghayeh hosseini

17

Tôi chỉ tìm thấy tất cả các ví dụ trên chỉ là quá khó hiểu, vì vậy tôi đã viết riêng của tôi. Các đoạn mã sẽ ổn nếu bạn biết bạn đang làm gì, nhưng những người như tôi thì không?

Bạn muốn một giải pháp cắt-n-dán thay thế? Vâng đây rồi!

Tạo một tệp java mới và gọi nó là Keystore. Sau đó dán vào mã này:

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

Bây giờ hãy lưu tập tin đó và quên nó đi. Bạn đã hoàn thành nó. Bây giờ hãy quay lại hoạt động của bạn và sử dụng nó như thế này:

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

Tôi sử dụng lớp này trong dự án của mình và khởi tạo các cuộc chia sẻ của mình trong BaseActivity và sử dụng trong các hoạt động khác (SplashScreen & đăng nhập & hoạt động chính) để kiểm tra trạng thái đăng nhập của người dùng và thoát khỏi ứng dụng. Nhưng điều này không hoạt động cho Android 8 để thoát! Bạn có bất cứ đề nghị?
roghayeh hosseini

15

Shared Preferenceslà các tệp XML để lưu trữ dữ liệu nguyên thủy riêng tư trong các cặp khóa-giá trị. Các kiểu dữ liệu bao gồm Booleans , float , ints , longschuỗi .

Khi chúng tôi muốn lưu một số dữ liệu có thể truy cập trong toàn bộ ứng dụng, một cách cần làm là lưu dữ liệu đó vào biến toàn cục. Nhưng nó sẽ biến mất sau khi ứng dụng được đóng lại. Một cách khác và được đề nghị là tiết kiệm trong SharedPreference. Dữ liệu được lưu trong tệp SharedPreferences có thể truy cập trong toàn bộ ứng dụng và vẫn tồn tại ngay cả sau khi ứng dụng đóng hoặc trên các lần khởi động lại.

SharedPreferences lưu dữ liệu theo cặp khóa-giá trị và có thể được truy cập theo cùng một cách.

Bạn có thể tạo Đối tượng SharedPreferencessử dụng hai phương thức,

1). getSharedPreferences () : Sử dụng các phương thức này, bạn có thể tạo Nhiều SharedPreferences. và các tham số đầu tiên của nó trong tên của SharedPreferences.

2). getPreferences () : Sử dụng phương thức này, bạn có thể tạo Đơn SharedPreferences.

Lưu trữ dữ liệu

Thêm một khai báo biến / Tạo tệp ưu tiên

public static final String PREFERENCES_FILE_NAME = "MyAppPreferences";

Lấy một tay cầm để đặt tên tệp (sử dụng getSharedPreferences)

SharedPreferences settingsfile= getSharedPreferences(PREFERENCES_FILE_NAME,0);

Mở Trình soạn thảo và Thêm cặp khóa-giá trị

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

Đừng quên áp dụng / lưu bằng cách sử dụng myeditor.apply()như hình trên.

Lấy dữ liệu

 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

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

}

**** Sử dụng Tùy chọn để ghi giá trị bằng cách sử dụng: - ****

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

**** Sử dụng Tùy chọn để đọc giá trị bằng cách sử dụng: - ****

Preferences.readString(getApplicationContext(), Preferences.NAME,
                    "");

7

Cách tốt nhất để tạo SharedPreferencevà để sử dụng toàn cầu, bạn cần tạo một lớp như dưới đây:

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

}

PreferenceManager.getDefaultSharedPreferences không được dùng nữa
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;
}

3

Viết thư cho Sở thích được chia sẻ

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

Đọc từ Sở thích được chia sẻ

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

Sử dụng getSharedPreferences ("MyPref", MODE_PRIVATE); thay vì: getPreferences (Context.MODE_PRIVATE); Bởi vì dữ liệu sẽ chỉ hợp lệ cho hoạt động bạn đang thực hiện. Điều này là do trong hoạt động này, tên tệp nằm trên tên hoạt động và vì vậy nếu bạn gọi tùy chọn này từ hoạt động khác, dữ liệu sẽ khác.
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", "");

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

3
Chào mừng bạn đến với Stack Overflow! Vui lòng giải thích cách sử dụng mã bạn cung cấp và lý do tại sao nó hoạt động. Cảm ơn!
intcreator

0

Bạn cũng có thể xem một dự án mẫu trong quá khứ của tôi, được viết cho mục đích này. Tôi lưu tên cục bộ và truy xuất tên đó theo yêu cầu của người dùng hoặc khi ứng dụng bắt đầu.

Nhưng, tại thời điểm này, sẽ tốt hơn nếu sử dụng commit(thay vì apply) để duy trì dữ liệu. Thêm thông tin ở đây .


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

0

Sở thích được chia sẻ rất dễ học, vì vậy hãy xem hướng dẫn đơn giản này về chia sẻ

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

    }
}
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.