21

Giả sử tôi có một ứng dụng lưu tùy chọn vào hai tệp, preferences1.xmlpreferences2.xml. Sau đó, tôi có thể truy xuất các tham chiếu đến các đối tượng tương ứng với mã sau:Đặt giá trị mặc định của nhiều phiên bản/tệp được chia sẻPreferences

SharedPreferences sharedPrefs1 = getSharedPreferences("preferences1", MODE_PRIVATE); 
SharedPreferences sharedPrefs2 = getSharedPreferences("preferences2", MODE_PRIVATE); 

Bằng cách này, tôi có thể thao tác các tùy chọn cho cả hai và đăng ký người nghe để thay đổi trên cả hai.

Tôi có một số nghi ngờ về tính khởi của hai tác phẩm, với setDefaultValues ​​:

Câu hỏi 1 - PreferenceFragment bối cảnh: Tôi đã tạo một PreferenceActivity với hai PreferenceFragments và trong phương thức onCreate của mỗi cái tôi thực thi đoạn mã sau (thay thế X bằng 1 và 2 cho đoạn 1 và 2):

PreferenceManager pm = getPreferenceManager(); 
pm.setSharedPreferencesName("preferencesX"); 

PreferenceManager.setDefaultValues(getActivity(),R.xml.preference_fragmentX, false); 

Tôi đã nhìn thấy rằng cả hai mảnh đặt đúng sở thích của họ với các giá trị mặc định của họ khi đưa ra .. nhưng, do thực tế mà tôi có thể nhìn thấy duy nhất một _has_set_default_values.xml tập tin trong shared_prefs thư mục của ứng dụng, làm cách nào để hiểu khi nào các thuộc tính của các tùy chọn preferences1.xmlpreferences2.xml đã được đặt? Tập tin này được tạo ra càng sớm càng setDefaultValues ​​ được gọi trong lần đầu tiên mở PreferenceFragment, nhưng thậm chí sau đó, nếu tôi mở thứ hai PreferenceFragment nó khởi một cách chính xác giá trị mặc định. Làm thế nào để nó hiểu rằng nó vẫn chưa được khởi tạo preferences2.xml và mục đích của _has_set_default_values.xml vì thực tế là nó không chứa thông tin về những tập tin nào đã được khởi tạo?

Câu hỏi 2 - Chuẩn Hoạt động bối cảnh: khi tôi bắt đầu ứng dụng của tôi, các PreferenceActivity không phải là hoạt động đầu tiên bắt đầu và người dùng có thể không bao giờ mở nó, vì vậy tôi muốn khởi tạo hai tập tin sở thích với họ giá trị mặc định cũng có trong hoạt động chính chính, làm cách nào tôi có thể thực hiện điều đó? Đối với các tùy chọn được chia sẻ mặc định, thật dễ dàng:

PreferenceManager.setDefaultValues(this, R.xml.default_preferences, false); 

Đối với hai tệp tùy chọn, tôi nên làm như thế nào? Tôi không thể làm điều gì đó như sau kể từ khi tôi không thể lấy một thể hiện của PreferenceManager như trong các lớp PreferenceFragment:

PreferenceManager pm = getPreferenceManager(); // NOT AVAILABLE AND NOT WANTED 
pm.setSharedPreferencesName("preferences1"); 
PreferenceManager.setDefaultValues(getActivity(),R.xml.preference_fragment1, false); 

PreferenceManager pm = getPreferenceManager(); // NOT AVAILABLE AND NOT WANTED 
pm.setSharedPreferencesName("preferences2");    
PreferenceManager.setDefaultValues(getActivity(),R.xml.preference_fragment2, false); 

đây trong Hoạt động chính tôi không có nhu cầu thay đổi các tập tin sở thích mà trên đó PreferenceManager sẽ hoạt động, vì chúng tôi không có trong PreferenceActivity, tôi chỉ muốn khởi tạo hai tệp đó ... bất kỳ trợ giúp nào? Tôi hy vọng tôi đã đăng một câu hỏi rõ ràng, ngay cả khi quá dài.

+1

@crazymaik Tôi đã xóa câu trả lời của mình vì tôi không nghĩ trả lời câu hỏi một cách thỏa đáng. Tôi đã dành một số giờ nhìn vào điều này bởi bây giờ, và nó vẫn còn là một bí ẩn hoàn chỉnh ... Hy vọng một người nào đó khác có thể làm sáng tỏ nó. –

+0

uz có thể giải thích thêm về SO Chat? – KOTIOS

+0

thử sử dụng tiền tố .Npacepace trong một tệp vật lý duy nhất để quản lý 2 tập hợp lôgic hoặc các loại tiền tố trong một tệp thủ công. Các mảnh tương ứng của bạn sẽ có thể áp dụng tiền tố NS theo cách không quá gây rối cho các hoạt động CRUD của bạn trên các thuộc tính pref. –

Trả lời

-2

1) Tôi đoán rằng các giá trị mặc định đó sẽ chỉ được tải nếu phương thức getDefaultSharedPreferences() được sử dụng và sẽ bị bỏ qua nếu bạn cung cấp tệp tùy chọn của riêng mình. Không thực sự chắc chắn về điều này.

2) Bạn có thể thiết lập chúng trên một lớp con Ứng dụng.

http://developer.android.com/reference/android/app/Application.html

Application.onCreate là điều đầu tiên cần được thực hiện khi người dùng khởi chạy ứng dụng của bạn. Đó là một điểm duy nhất để truy cập vào ứng dụng của bạn và do đó, một nơi tốt để khởi tạo tất cả dữ liệu mà ứng dụng của bạn cần trên toàn hệ thống.

Vì Ứng dụng mở rộng ContextWrapper, bạn có quyền truy cập vào SharedPreferences thông qua phương thức getSharedPreferences (tệp, chế độ). Bạn có thể sử dụng nó để truy xuất hai tệp tùy chọn của mình.

0

Ví Câu hỏi 1

Tôi tin rằng _has_set_default_values.xml tập tin chỉ là một tập tin sở thích ... và nó sẽ lưu cặp/giá trị quan trọng trong đó có chìa khóa là tên của tập tin và sở thích giá trị là liệu giá trị mặc định đã được đặt chưa.

Ví Câu hỏi 2

Tại sao không sử dụng các phiên bản của PreferenceManager.setDefaultValues ​​() mà có tên của các ưu đãi chia sẻ tập tin? Đây là phương pháp chữ ký:

public static void setDefaultValues (Context context, String sharedPreferencesName, int sharedPreferencesMode, int resId, boolean readAgain) 

http://developer.android.com/reference/android/preference/PreferenceManager.html

1

bạn có thể tạo một sở thích như thế này:

public class MyPreference { 

    private static final String APP_SHARED_PREFS1 = "myPrefc1"; 
    private static final String APP_SHARED_PREFS2 = "myPrefc2"; 
    private SharedPreferences appSharedPrefs1; 
    private SharedPreferences appSharedPrefs2; 
    private Editor    prefsEditor1; 
    private Editor    prefsEditor2; 


    public MyPreference(Context context) { 
     this.appSharedPrefs1 = context.getSharedPreferences(APP_SHARED_PREFS1, Activity.MODE_PRIVATE); 
     this.appSharedPrefs2 = context.getSharedPreferences(APP_SHARED_PREFS2, Activity.MODE_PRIVATE); 
     this.prefsEditor1 = appSharedPrefs1.edit(); 
     this.prefsEditor2 = appSharedPrefs2.edit(); 
    } 

public void saveServices(String servicName, boolean isActivated) { 
     prefsEditor1.putBoolean(servicName, isActivated); 
     prefsEditor1.commit(); 
     prefsEditor2.putBoolean(servicName, isActivated); 
     prefsEditor2.commit(); 
    } 

trên của bạn tiết kiệm dịch vụ hay cái gì khác bạn muốn làm với sở thích của bạn các dữ liệu sẽ tiết kiệm trong cả hai tập tin.

và cho câu hỏi thứ hai của bạn:

tạo ra một lớp toàn cầu như G

và sau đó tuyên bố sở thích của bạn như thế này:

public class G extends Application{ 

    public static Activity currentActivity = null; 
    public static MyPreference myAppPref = null; 


    @Override 
    public void onCreate() { 

     super.onCreate(); 

     myAppPref = new MyPreference(G.this); 


    } 


} 

và khi hoạt động chính của bạn chạy bạn nên làm như thế này :

G.currentActivity = MainActivity.this; 
G. myAppPref.saveServices("testpref", true);