2012-07-19 33 views
11

Có cách nào để làm cho SharedPreferences toàn cầu trong toàn bộ ứng dụng của tôi không? Hiện tại tôi đang sử dụng những dòng này ở nhiều nơi trong suốt mã của mình để lưu trữ cài đặt bật/tắt đơn giản cho một số tùy chọn mà người dùng của tôi có thể đặt. Tôi chỉ muốn gọi cho họ một lần trên toàn cầu nếu có thể:Có cách nào để làm cho SharedPreferences toàn cầu trong toàn bộ ứng dụng Android của tôi không?

SharedPreferences settings = getSharedPreferences("prefs", 0); 
SharedPreferences.Editor editor = settings.edit(); 

Bất cứ lời khuyên về cách để có thể gọi chỉ những dòng trong tất cả các lớp sẽ được awesome:

editor.putString("examplesetting", "off"); 
editor.commit(); 

String checkedSetting = settings.getString("examplesetting", ""); 
+0

Xem câu trả lời của tôi. Nó hoạt động –

Trả lời

14

Tôi biết, tôi biết, tôi sẽ bị viêm, và được đúc vào than hồng của địa ngục ....

Sử dụng hát lớp leton rằng kết thúc tốt đẹp xung quanh SharedPreference thiết lập .. một cái gì đó như thế này:

public class PrefSingleton{ 
    private static PrefSingleton mInstance; 
    private Context mContext; 
    // 
    private SharedPreferences mMyPreferences; 

    private PrefSingleton(){ } 

    public static PrefSingleton getInstance(){ 
     if (mInstance == null) mInstance = new PrefSingleton(); 
     return mInstance; 
    } 

    public void Initialize(Context ctxt){ 
     mContext = ctxt; 
     // 
     mMyPreferences = PreferenceManager.getDefaultSharedPreferences(mContext); 
    } 
} 

Và tạo chức năng bao bọc xung quanh những gì ví dụ của bạn thể hiện trong câu hỏi, ví dụ,

PrefSingleton.getInstance().writePreference("exampleSetting", "off");

và thi thể như sau:

// Within Singleton class 

public void writePreference(String key, String value){ 
    Editor e = mMyPreference.edit(); 
    e.putString(key, value); 
    e.commit(); 
} 

Từ hoạt động đầu tiên của bạn, kích hoạt lớp đơn, theo cách này, một cái gì đó như thế này:

PrefSingleton.getInstance().Initialize(getApplicationContext()); 

Lý do tôi có nguy cơ xuống bỏ phiếu, được, sử dụng lớp tĩnh toàn cầu có thể là một ý tưởng tồi và đi ngược lại việc thực hành nguyên tắc cơ bản lập trình. NHƯNG có nói rằng, khi yêu cầu nit sang một bên, nó sẽ đảm bảo chỉ một đối tượng duy nhất của lớp PrefSingleton có thể tồn tại và có thể truy cập bất kể hoạt động của mã.

+2

Tùy chọn có hoạt động với ngữ cảnh ứng dụng không? Rất nhiều điều không, vì vậy việc sử dụng nó luôn phức tạp. Ngoài ra 'hoạt động đầu tiên' là một chút không xác định, kể từ khi ứng dụng có thể được bắt đầu từ một phát sóng, đang chờ ý định (widget, vv). –

+0

@NikolayElenkov chắc chắn, tôi đồng ý với bạn, hãy nhớ, tôi đưa vào một ví dụ chung chung là đỉnh đầu của tôi ... nó có thể được sửa đổi cho phù hợp với nhu cầu của một người. :) – t0mm13b

+2

Nếu bạn mở rộng Ứng dụng, bạn có thể khởi tạo singleton của mình trong lớp con và tránh sự cố 'hoạt động đầu tiên' không? – qix

9

Tôi sẽ mở rộng Application và bao gồm SharedPreferences.Editor làm trường có bộ thu tiền.

public class APP extends Application { 
    private final SharedPreferences settings = getSharedPreferences("prefs", 0); 
    private final SharedPreferences.Editor editor = settings.edit(); 

    public SharedPreferences.Editor editSharePrefs() { 
     return editor; 
    } 
} 

Sau đó, bạn có thể truy cập nó từ bất kỳ Activity với

((APP) getApplication()).editSharePrefs().putString("examplesetting", "off"); 
((APP) getApplication()).editsharePrefs().commit(); 

Ngoài ra, bạn cũng có thể ném vào phương pháp

public static APP getAPP(Context context) { 
     return (APP) context.getApplicationContext(); 
    } 

Mặc dù, điều này sẽ chỉ cần thay đổi các cuộc gọi bạn thực hiện cho

APP.getAPP(this).editSharePrefs().putString("examplesetting", "off"); 
APP.getAPP(this).editsharePrefs().commit(); 

Vì vậy, nó thực sự là một sở thích cá nhân, trông sạch hơn cho bạn.

+4

Trong khi điều này làm việc, sử dụng một lớp ứng dụng cho điều này là quá mức cần thiết. Chưa kể rằng bạn sẽ phải đúc nó vào lớp bê tông của bạn mỗi lần. Một lớp trình trợ giúp đơn giản với các phương thức tĩnh có tham số 'Context' (bạn có thể truyền' this' khi trong một hoạt động) tốt hơn nhiều. Ứng dụng không thực sự mua cho bạn bất cứ điều gì trong trường hợp này. –

0

Sử dụng lớp Trình trợ giúp để có được tất cả những gì bạn muốn, làm cho các phương thức tĩnh. Đây là cách ADW thực hiện.

2

tôi sẽ làm điều này như sau:

public class BaseActivity extends Activity { 

     protected boolean setInHistory; 
     protected SharedPreferences sharedPrefs; 

      @Override 
     protected void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    sharedPrefs = PreferenceManager.getDefaultSharedPreferences(this); 
    setInHistory = true; 
     } 


} 


public class MainActivity extends BaseActivity { 

     public void onCreate(Bundle savedInstanceState) { 
       super.onCreate(savedInstanceState); 
       setContentView(R.layout.activity_main); 

       System.out.println(setInHistory+" <-- setInhistory"); 

      } 
} 

Sau đó có thể truy cập sharedPrefs bởi vì nó được bảo vệ sau đó nó có thể truy cập thông qua các gói.

In the console you have : true <-- setInhistory 
+0

Đây là giải pháp yêu thích của tôi. – Ish

+0

Tôi nghĩ rằng điều này sẽ chỉ hoạt động nếu bạn có tất cả các hoạt động của bạn mở rộng BaseActivity. Điều gì sẽ xảy ra nếu bạn có Fragments hoặc ViewPagerAdapters mà bạn cần lưu trữ các biến? – Simon

+0

@Simon bạn có thể chỉ cần cast getActivity của bạn? ex, '((MainActivity) getActivity) getSharedPref();'? làm thế nào về điều đó? –

-1

Sử dụng này để thiết lập các thiết lập:

public static void SetCheckedSetting(Context context, String value) 
{ 
    SharedPreferences settings = getSharedPreferences("prefs", 0); 
    SharedPreferences.Editor editor = settings.edit(); 
    editor.putString("examplesetting", value); 
    editor.commit(); 
} 

Và điều này để có được những khung cảnh:

public static String GetCheckedSetting(Context context) 
{ 
    SharedPreferences settings = getSharedPreferences("prefs", 0); 
    return settings.getString("examplesetting", ""); 
} 

Để vượt qua bối cảnh mà bạn chỉ có thể sử dụng this từ khóa.

Điều quan trọng là bạn làm không lưu trữ SharedPreferences làm biến tĩnh. Nếu bạn làm điều đó gây ra một rò rỉ bộ nhớ. Xem: http://android-developers.blogspot.in/2009/01/avoiding-memory-leaks.html

Các vấn đề liên quan