Làm thế nào để phát hiện xem các thay đổi đã được thực hiện trong các tùy chọn?


76

Tôi có một lớp học mở rộng PreferenceActivity và hiển thị màn hình tùy chọn của ứng dụng của mình. Có thể kiểm tra xem có bất kỳ thay đổi nào được thực hiện đối với các tùy chọn không?

Điều này có ích...

http://developer.android.com/reference/android/content/SharedPreferences.OnSharedPreferenceChangeListener.html

Bài đăng liên quan khác: SharedPreferences.onSharedPreferenceChangeListener không được gọi nhất quán


public class PreferenceClass extends PreferenceActivity {

    OnSharedPreferenceChangeListener listener;

    public void onCreate(Bundle savedInstanceState) {
        SharedPreferences prefs = this.getSharedPreferences("settings", 0);
        listener = new SharedPreferences.OnSharedPreferenceChangeListener() {

            public void onSharedPreferenceChanged(SharedPreferences prefs, String key) {
                int flag = 1;
            }
        };
        prefs.registerOnSharedPreferenceChangeListener(listener);
        super.onCreate(null);
        addPreferencesFromResource(R.xml.settings);
    }
}

Tôi thấy có quá nhiều hướng điều này có thể đi tùy thuộc vào mục tiêu tổng thể của bạn. Bạn có thể đưa ra một số chi tiết cụ thể về thời điểm bạn đang kiểm tra và kết thúc không?
R Hughes

@RHughes Tôi chỉ muốn mỗi khi thay đổi được thực hiện để làm gì đó ... Vừa tìm thấy liên kết này stackoverflow.com/questions/2542938/… ... Tuy nhiên, vẫn không thể làm cho nó hoạt động ... phương thức trong trình nghe không bao giờ được gọi ... Có ý kiến ​​gì không ???
mixkat

Nếu không nhìn vào mã, tôi chỉ có thể đoán rằng bạn đang mắc phải lỗi giống như tôi luôn mắc phải. Tôi xây dựng một người nghe tuyệt vời sau đó quên gắn nó vào đúng đối tượng. Ngoài ra, hãy đảm bảo rằng bạn đang gắn trình nghe với đối tượng trong phương thức onCreate () hoặc ít nhất là trong mã mà bạn chạy TRƯỚC KHI bạn thực sự cần trình nghe.
R Hughes

@RHughes Không Im gắn người nghe đến đối tượng ... donno sai gì với nó ... nó chắc chắn trên tạo ... anyways nhờ trả lời ...
mixkat

Câu trả lời:


67

Làm

SharedPreferences.OnSharedPreferenceChangeListener spChanged = new
                           SharedPreferences.OnSharedPreferenceChangeListener() {
            @Override
    public void onSharedPreferenceChanged(SharedPreferences sharedPreferences,
            String key) {
        // your stuff here
    }
};

Trong của bạn PreferenceActivity, tức là biến nó thành thành viên của PreferenceActivitylớp bạn và sau đó thực hiện registerOnSharedPreferenceChangeListener(spChanged)trong PreferenceActivity.onCreate()phương thức.

Đó là những gì tôi làm và tôi không bao giờ gặp vấn đề.

Nếu không, đó là lỗi kiểm tra có điều kiện của bạn trong trình nghe. Đăng mã.

BIÊN TẬP:

Từ mã bạn đã đăng, bạn nên tạo prefsmột biến thành viên lớp để nó có phạm vi toàn cầu.

Và làm prefs = PreferenceManager.getDefaultSharedPreferences(getApplicationContext());thay getSharedPreferencesvì bạn chưa tạo tệp đó.

Để tạo một tệp bạn cần sử dụng PreferenceManager. Để có được một PreferenceManager, hãy sử dụng Activity.getPreferenceManager().


@sugarynugs Thats chính xác những gì tôi đang làm ... trong thực tế tôi sao chép mã từ bài này khác ...
mixkat

@sugarynugs listening = new SharedPreferences.OnSharedPreferenceChangeListener () {public void onSharedPreferenceChanged (SharedPreferences prefs, String key) {// Thực hiện}}); prefs.registerOnSharedPreferenceChangeListener (người nghe)
mixkat

1
Trình nghe @sugarynugs là một biến thể hiện của lớp này..chỉ cần tránh nó là gc ..
mixkat

1
khai báo biến ở đâu? Nó là một Global? Cộng với mã đăng sai ... bit bên trong người nghe.
techiServices

1
@RenniePet, Không, bạn không cần phải hủy đăng ký trình xử lý tùy chọn đã đăng ký trong lớp Ứng dụng. Ví dụ: Nếu bạn không hủy đăng ký một người nghe trong lớp Hoạt động, thì trình thu gom rác sẽ không giải phóng bộ nhớ được phân bổ bởi đối tượng Hoạt động sau khi hoạt động đóng (trình quản lý tùy chọn có tham chiếu đến trình nghe, trình nghe có tham chiếu đến hoạt động). Nhưng bạn không gặp trường hợp đó với lớp Ứng dụng.
babay,

67

Trong PreferenceActivitylớp của bạn , hãy triển khai SharedPreferences.OnSharedPreferenceChangeListenergiao diện. Thêm onSharedPreferenceChangedphương thức bắt buộc vào lớp học của bạn và đăng ký nó trong onCreate.

Xem mẫu mã tại đây:

public class MyPreferences extends PreferenceActivity implements SharedPreferences.OnSharedPreferenceChangeListener {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        addPreferencesFromResource(R.xml.fw_preferences); //deprecated
        PreferenceManager.getDefaultSharedPreferences(this).registerOnSharedPreferenceChangeListener(this);
    }

    @Override
    public void onSharedPreferenceChanged(SharedPreferences sharedPreferences, String key) {
        // handle the preference change here
    }

}

1
Bạn sẽ cấu trúc lại dòng không dùng nữa mà bạn có trong mã của mình như thế nào? addPreferencesFromResource(R.xml.fw_preferences); //deprecated
mattecalcio

1
@mattecalcio Tôi biết mình đến muộn nhưng đây là cách mới để tải trong cài đặt xml: stackoverflow.com/a/13441715/1318194

2
Bạn có nên thực hiện hủy đăng kýOnSharedPreferenceChangeListener (this) trong onDestroy () của MainActivity không?
Andrii Kovalchuk

1
câu trả lời của bạn tuyệt vời nhưng cũng có tài liệu nói: thêm phần đăng ký trong sơ yếu lý lịch và thêm phần hủy đăng ký tạm dừng cho bộ thu thập rác. cảm ơn một lần nữa developer.android.com/guide/topics/ui/…
mehmet

Cùng với việc thực hiện giao diện OnSharedPreferenceChangeListenervà đăng ký listener trên onResumevà unregister trênonPause
MRodrigues
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.