2010-04-10 15 views
328

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 thiết lập thông qua một file xml để onCreate của tôi (và các phương pháp lớp học đầy đủ) trông như thế này:Tôi làm cách nào để nhận SharedPreferences từ PreferenceActivity trong Android?

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

Các javadoc của PreferenceActivityPreferenceFragment khẳng định rằng

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

Nhưng làm cách nào tôi nhận đượ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 sử dụng bởi PreferenceActivity. Tên hoặc cách tôi có thể truy xuất tên đó là gì?

Trả lời

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

Cập nhật

Theo Shared Preferences | Android Developer Tutorial (Part 13) Sài Geetha M N,

Nhiều ứng dụng có thể cung cấp một cách để nắm bắt sở thích người dùng trên 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ặp giá trị tên. Chúng có thể được lưu trữ dưới dạng “Tùy chọn được chia sẻ” trên các hoạt động khác nhau trong một ứng dụng (lưu ý hiện tại không thể chia sẻ các quy trình này qua các quy trình). Hoặc có thể là thứ gì đó cần phải được lưu trữ cụ thể cho hoạt động.

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

  2. Tùy chọn được xử lý hoạt động: Các tùy chọn này chỉ có thể được sử dụng trong 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.

Preferences chung:

Các sở thích chia sẻ được quản lý với sự giúp đỡ của getSharedPreferences phương pháp của lớp Context. Các sở thích được lưu trong tập tin mặc định (1) hoặc bạn có thể chỉ định tên tập tin (2) để sử dụng để tham chiếu đến các sở thích.

(1) Cách đề nghị là sử dụng bởi chế độ mặc định, mà không chỉ định tên tập tin

SharedPreferences preferences = PreferenceManager.getDefaultSharedPreferences(context); 

(2) Đây là cách bạn có được dụ khi bạn chỉ định tên tập tin

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

MODE_PRIVATE là chế độ hoạt động cho các tùy chọn. Đây là chế độ mặc định và có nghĩa là tệp được 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_WRITEABLE các ứng dụng khác cũng có quyền ghi cho tệp được tạo.

Cuối cùng, một khi bạn có các trường hợp sở thích, đây là cách bạn có thể lấy các giá trị được lưu trữ những ưu đãi:

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

Để cửa hàng đánh giá cao trong file thích SharedPreference.Editor đối tượng phải được sử dụng . Editor là giao diện lồng nhau trong lớp SharedPreference.

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

Editor cũng hỗ trợ các phương pháp như remove()clear() để xóa các giá trị ưu tiên từ tập tin.

Preferences

Hoạt động:

Các sở thích 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ẻ sở thích 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ể làm điều đó với sự trợ giúp của phương thức hoạt động của getPreferences(). Phương thức getPreference sử dụng phương thức getSharedPreferences() với tên của lớp hoạt động cho tên tệp tùy chọn.

Tiếp theo là mã để có được ưu đãi về

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 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ó tên là android.preference. Gói này định nghĩa các lớp để triển khai UI tùy chọn ứng dụng.

Để xem một số ví dụ khác, hãy kiểm tra bài đăng trên trang web nhà phát triển của Data Storage của Android.

+51

+1: u lưu ngày của tôi .. không ai trong số các hướng dẫn/ví dụ trên Internet nói về việc này. tất cả họ đều nói về các tính năng và tùy chỉnh của abt, nhưng không phải cách đọc nó. – ankitjaininfo

+0

btw, tập tin 'name' trong trường hợp này là gì? – ankitjaininfo

+1

Xem cập nhật câu trả lời của tôi và tên tệp giống như 'package.prefs' nhưng tôi không chắc chắn. – Pentium10

29

Nếu bạn không có quyền truy cập vào getDefaultSharedPreferenes(), bạn có thể sử dụng getSharedPreferences(name, mode) thay vào đó, bạn chỉ cần chuyển đú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 mã sau vào một số SettingsActivityonCreate() và xem những gì preferencesName là.

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

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

+0

Nguồn cho hoạt động đọc: chia sẻ công khaiPhụ kiện getPreferences (chế độ int) { trả về getSharedPreferences (getLocalClassName(), chế độ); } – Tatarize

18

Khai báo các phương pháp này đầu tiên ..

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 là khi bạn muốn đặt một pref:

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

cuộc gọi này khi bạn muốn có được một pref:

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 mà đơn giản hóa mọi thứ hơn nữa

Ví 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); 
+0

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

2

phải vượt qua bối cảnh xung quanh ở khắp mọi nơi là thực sự làm phiền tôi. mã trở nên quá dài 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; 

cũng tất cả các phím thích nên ngôn ngữ độc lập, tôi bị sốc không ai đã nói rằng.

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

nay gọi nó là 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); 
+3

Ưu điểm của việc làm cho ngôn ngữ phím độc lập là gì? Họ 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 Thiên 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 một bối cảnh toàn cục thì hãy làm như vậy bằng cách sử dụng một lớp ứng dụng tùy chỉnh. – Thorben

+1

@Thorben Đồng ý. Hoặc đơn giản là 'getApplicationContext()' –

2

nếu bạn có một hộp kiểm và bạn muốn lấy giá trị của nó tức là đúng/sai trong bất kỳ java file--

Use--

Context mContext; 
boolean checkFlag; 

checkFlag=PreferenceManager.getDefaultSharedPreferences(mContext).getBoolean(KEY,DEFAULT_VALUE);` 
Các vấn đề liên quan