Làm cách nào để tôi có được SharedPreferences từ PreferenceActivity trong Android?


373

Tôi đang sử dụng PreferenceActivity để hiển thị một số cài đặt cho ứng dụng của mình. Tôi đang thổi phồng các cài đặt thông qua tệp xml để onCreate (và các phương thức lớp hoàn chỉnh) của tôi trông như thế này:

public class FooActivity extends PreferenceActivity {
    @Override
    public void onCreate(Bundle icicle) {
        super.onCreate(icicle);
        addPreferencesFromResource(R.xml.preference);
    }
}

Javadoc của PreferenceActivity PreferenceFragment nói rằng

Các tùy chọn này sẽ tự động lưu vào SharedPreferences khi người dùng tương tác với chúng. Để truy xuất một thể hiện của SharedPreferences mà hệ thống phân cấp ưu tiên trong hoạt động này sẽ sử dụng, hãy gọi getDefaultSharedPreferences (android.content.Context) với ngữ cảnh trong cùng gói với hoạt động này.

Nhưng làm thế nào tôi có được tên của SharedPreference trong một Hoạt động khác? Tôi chỉ có thể gọi

getSharedPreferences(name, mode)

trong hoạt động khác nhưng tôi cần tên của SharedPreference được PreferenceActivity sử dụng. Tên là gì hoặc làm thế nào tôi có thể lấy nó?

Câu trả lời:


721
import android.preference.PreferenceManager;
SharedPreferences prefs = PreferenceManager.getDefaultSharedPreferences(this);
// then you use
prefs.getBoolean("keystring", true);

Cập nhật

Theo Sở thích chung | Hướng dẫn dành cho nhà phát triển Android (Phần 13) của Sai Geetha MN,

Nhiều ứng dụng có thể cung cấp một cách để nắm bắt các tùy chọn của người dùng trên các cài đặt của một ứng dụng cụ thể hoặc một hoạt động. Để hỗ trợ điều này, Android cung cấp một bộ API đơn giản.

Tùy chọn thường là các cặp giá trị tên. Chúng có thể được lưu trữ dưới dạng Tùy chọn chia sẻ của nhóm Khác nhau trong các hoạt động khác nhau trong một ứng dụng (lưu ý hiện tại nó không thể được chia sẻ qua các quy trình). Hoặc nó có thể là một cái gì đó cần được lưu trữ cụ thể cho một hoạt động.

  1. Tùy chọn chia sẻ: Tùy chọn chia sẻ có thể được sử dụng bởi tất cả các thành phần (hoạt động, dịch vụ, v.v.) của ứng dụng.

  2. Các tùy chọn xử lý hoạt động: Các tùy chọn này chỉ có thể được sử dụng trong các hoạt động cụ thể và không thể được sử dụng bởi các thành phần khác của ứng dụng.

Tùy chọn được chia sẻ:

Các tùy chọn chia sẻ được quản lý với sự trợ giúp của getSharedPreferencesphương thức của Contextlớp. Các tùy chọn được lưu trữ trong một tệp mặc định (1) hoặc bạn có thể chỉ định tên tệp (2) sẽ được sử dụng để tham chiếu các tùy chọn.

(1) Cách được khuyến nghị là sử dụng chế độ mặc định, mà không chỉ định tên tệp

SharedPreferences preferences = PreferenceManager.getDefaultSharedPreferences(context);

(2) Đây là cách bạn lấy ví dụ khi bạn chỉ định tên tệp

public static final String PREF_FILE_NAME = "PrefFile";
SharedPreferences preferences = getSharedPreferences(PREF_FILE_NAME, MODE_PRIVATE);

MODE_PRIVATElà chế độ hoạt động cho các sở thích. Đây là chế độ mặc định và có nghĩa là tệp đã tạo sẽ chỉ được truy cập bởi ứng dụng gọi điện. Hai chế độ khác được hỗ trợ là MODE_WORLD_READABLEMODE_WORLD_WRITEABLE. Trong MODE_WORLD_READABLEứng dụng khác có thể đọc tệp đã tạo nhưng không thể sửa đổi nó. Trong trường hợp MODE_WORLD_WRITEABLEcác ứng dụng khác cũng có quyền ghi cho tệp được tạo.

Cuối cùng, khi bạn có phiên bản tùy chọn, đây là cách bạn có thể truy xuất các giá trị được lưu trữ từ các tùy chọn:

int storedPreference = preferences.getInt("storedInt", 0);

Để lưu trữ các giá trị trong SharedPreference.Editorđối tượng tệp ưu tiên phải được sử dụng. Editorlà một giao diện lồng nhau trong SharedPreferencelớp.

SharedPreferences.Editor editor = preferences.edit();
editor.putInt("storedInt", storedPreference); // value to store
editor.commit();

Trình chỉnh sửa cũng hỗ trợ các phương thức như remove()clear()xóa các giá trị ưu tiên khỏi tệp.

Tùy chọn hoạt động:

Các tùy chọn chia sẻ có thể được sử dụng bởi các thành phần ứng dụng khác. Nhưng nếu bạn không cần chia sẻ các tùy chọn với các thành phần khác và muốn có các tùy chọn riêng tư hoạt động, bạn có thể thực hiện điều đó với sự trợ giúp của getPreferences()phương thức hoạt động. Các getPreferencephương pháp sử dụng các getSharedPreferences()phương pháp với tên của lớp hoạt động cho tên tập tin thích.

Sau đây là mã để có được ưu tiên

SharedPreferences preferences = getPreferences(MODE_PRIVATE);
int storedPreference = preferences.getInt("storedInt", 0);

Mã để lưu trữ các giá trị cũng giống như trong trường hợp sở thích được chia sẻ.

SharedPreferences preferences = getPreference(MODE_PRIVATE);
SharedPreferences.Editor editor = preferences.edit();
editor.putInt("storedInt", storedPreference); // value to store
editor.commit();

Bạn cũng có thể sử dụng các phương pháp khác như lưu trữ trạng thái hoạt động trong cơ sở dữ liệu. Lưu ý Android cũng chứa một gói được gọi là android.preference. Gói định nghĩa các lớp để thực hiện UI tùy chọn ứng dụng.

Để xem thêm một số ví dụ, hãy kiểm tra bài Lưu trữ dữ liệu của Android trên trang web của nhà phát triển.


55
+1: u đã lưu ngày của tôi .. không có hướng dẫn / ví dụ nào trên Internet nói về điều này. tất cả họ nói về các tính năng và tùy chỉnh abt, nhưng không biết cách đọc nó.
ankitjaininfo

1
Xem cập nhật của tôi về câu trả lời, và tên tệp là một cái gì đó giống như package.prefsnhưng tôi không chắc chắn.
Pentium10

1
Cảm ơn mã. Chỉ có một điều nhỏ làm tôi bối rối: SharedPreference là một giao diện, vậy mã thực tế được triển khai ở đâu để xử lý bất kỳ lệnh gọi phương thức nào?
x1886x

1
Ước gì tôi đã đọc nó một tuần trước khi lãng phí thời gian để đọc một số câu trả lời / bình luận ngu ngốc trên khắp SE, họ nghĩ rằng họ biết khi họ thực sự không .. Cảm ơn @ Pentium10, bạn có sở hữu blog nào không, cảm ơn lần nữa, thực sự đánh giá cao nó :)
Sanjeevcn 14/03/2015

1
Thay vì sử dụng Editor.commit (), bạn cũng có thể sử dụng Editor.apply (). Sự khác biệt là commit () ghi các thay đổi của bạn một cách đồng bộ và áp dụng ghi chúng không đồng bộ. Điều này làm cho giao diện người dùng của bạn nhanh hơn.
Hashim Akhtar

29

Nếu bạn không có quyền truy cập getDefaultSharedPreferenes(), bạn có thể sử dụng getSharedPreferences(name, mode)thay vào đó, bạn chỉ cần nhập đúng tên.

Android tạo tên này (có thể dựa trên tên gói của dự án của bạn?). Bạn có thể lấy nó bằng cách đặt đoạn mã sau vào SettingsActivity onCreate()và xem nó preferencesNamelà gì .

String preferencesName = this.getPreferenceManager().getSharedPreferencesName();

Chuỗi nên là một cái gì đó như com.example.projectname_preferences. Mã cứng mà ở đâu đó trong dự án của bạn, và chuyển nó vào getSharedPreferences()và bạn nên đi.


1
Nguồn cho hoạt động đọc: công khai SharedPreferences getPreferences (int mode) {return getSharedPreferences (getLocalClassName (), mode); }
Tatarize

22

Khai báo các phương thức này trước ..

public static void putPref(String key, String value, Context context) {
    SharedPreferences prefs = PreferenceManager.getDefaultSharedPreferences(context);
    SharedPreferences.Editor editor = prefs.edit();
    editor.putString(key, value);
    editor.commit();
}

public static String getPref(String key, Context context) {
    SharedPreferences preferences = PreferenceManager.getDefaultSharedPreferences(context);
    return preferences.getString(key, null);
}

Sau đó gọi đây khi bạn muốn đặt một pref:

putPref("myKey", "mystring", getApplicationContext());

gọi cái này khi bạn muốn lấy tiền tố:

getPref("myKey", getApplicationContext());

Hoặc bạn có thể sử dụng đối tượng này https://github.com/kcochibili/TinyDB--Android-Shared-Preferences-Turbo để đơn giản hóa mọi thứ hơn nữa

Thí dụ:

TinyDB tinydb = new TinyDB(context);

tinydb.putInt("clickCount", 2);
tinydb.putFloat("xPoint", 3.6f);
tinydb.putLong("userCount", 39832L);

tinydb.putString("userName", "john");
tinydb.putBoolean("isUserMale", true); 

tinydb.putList("MyUsers", mUsersArray);
tinydb.putImagePNG("DropBox/WorkImages", "MeAtlunch.png", lunchBitmap);

Tại sao không sử dụng Editor.apply (); thay vì cam kết xử lý ở chế độ nền
Avi Parshan

4

phải vượt qua bối cảnh ở khắp mọi nơi thực sự làm tôi khó chịu. mã trở nên quá dài dòng và không thể quản lý được. Tôi làm điều này trong mọi dự án thay vì ...

public class global {
    public static Activity globalContext = null;

và đặt nó trong hoạt động chính tạo

@Override
public void onCreate(Bundle savedInstanceState) {
    Thread.setDefaultUncaughtExceptionHandler(new CustomExceptionHandler(
            global.sdcardPath,
            ""));
    super.onCreate(savedInstanceState);

    //Start 
    //Debug.startMethodTracing("appname.Trace1");

    global.globalContext = this;

Ngoài ra, tất cả các khóa ưu tiên phải độc lập với ngôn ngữ, tôi bị sốc không ai đề cập đến điều đó.

getText(R.string.yourPrefKeyName).toString()

bây giờ gọi nó rất đơn giản như thế này trong một dòng mã

global.globalContext.getSharedPreferences(global.APPNAME_PREF, global.MODE_PRIVATE).getBoolean("isMetric", true);

4
Lợi thế của việc làm cho ngôn ngữ khóa độc lập là gì? Chúng không bao giờ được hiển thị cho người dùng, phải không?
Gerd

1
Xin vui lòng, vì tình yêu của chúa, không bao giờ sử dụng một Hoạt động như một bối cảnh toàn cầu. Nếu bạn phải sử dụng Bối cảnh toàn cầu thì vui lòng thực hiện bằng cách sử dụng lớp Ứng dụng tùy chỉnh.
Thorben

1
@Thorben Đồng ý. Hoặc đơn giản hơngetApplicationContext()
OneCricketeer

3

nếu bạn có một hộp kiểm và bạn muốn tìm nạp giá trị của nó tức là true / false trong bất kỳ tệp java nào--

Sử dụng--

Context mContext;
boolean checkFlag;

checkFlag=PreferenceManager.getDefaultSharedPreferences(mContext).getBoolean(KEY,DEFAULT_VALUE);`

0

Cập nhật 2019

Bạn chỉ có thể sử dụng PowerPreferencethư viện

https://github.com/AliEsaAssadi/Android-Power-Preference

Lấy ví dụ tùy chọn chia sẻ

Để lấy ví dụ mặc định, bạn chỉ cần gọi

PowerPreference.getDefaultFile()

Hoặc nếu bạn muốn một tệp ưu tiên cụ thể

PowerPreference.getFileByName(fileName)

Viết dữ liệu:

PowerPreference.getDefaultFile().put(key,value)

Lấy dữ liệu

PowerPreference.getDefaultFile().getString(key,value)

PowerPreference xử lý phần bối cảnh như thế nào? Một bối cảnh là cần thiết để đọc các prefs chia sẻ, không? Tôi mới dùng Android và đang cố gắng hiểu.
Yeti

0

Hãy thử làm theo mã nguồn nó làm việc cho tôi

//Fetching id from shared preferences
    SharedPreferences sharedPreferences;
    sharedPreferences =getSharedPreferences(Constant.SHARED_PREF_NAME, Context.MODE_PRIVATE);
    getUserLogin = sharedPreferences.getString(Constant.ID_SHARED_PREF, "");
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.