2016-04-20 26 views
6

Tôi có mã kế thừa mở rộng PreferenceActivity với một phân lớp được gọi là "Preferences". Các PreferenceActivity được gọi như sau:Làm thế nào để tham khảo hoặc "tìm" một PreferenceActivity?

Intent intent = new Intent(this, Preferences.class); 
    this.startActivity(intent); 

các OnSharedPreferenceChangeListener tồn tại trong một khác mảnh (không phải là lớp con PreferenceActivity) nhưng cần một tham chiếu đến PreferenceActivity để sửa đổi các thuộc tính của một sở thích tùy chỉnh/kiểm soát tương tự như sau:

pref = (CheckBoxPreference) prefActivity.findPreference(res.getString(R.string.keyAccount)); 
    pref.setSummary("something"); 

trong đó "prefActivity" là tham chiếu đến PreferenceActivity. Bất cứ ai có thể đề nghị làm thế nào để lưu một tham chiếu đến PreferenceActivity khi nó được tạo ra hoặc bằng cách khác xác định vị trí PreferenceActivity khi cần thiết?

CHỈNH SỬA: Bao gồm mã quá thô sơ để hy vọng giúp hiển thị cấu trúc phân cấp và làm rõ.

Tính năng CPA FragmentActivity khởi tạo CPFragment và theo yêu cầu (nhấn nút) tạo Intent để kích hoạt lớp con PreferenceActivity (được gọi là "Preferences").

public class CPActivity extends FragmentActivity 
{ 
public static CPActivity inst; 
private CPFragment mFragmentCP; 

    @Override 
    protected void onCreate(Bundle savedInstanceState) 
    { 
    super.onCreate(savedInstanceState); 
    inst = this; 
    mFragmentCP = new CPFragment(); 
    } 

    public void onSettingsButtonPressed() { 
    // Bring up the Preferences menu 
    Intent intent = new Intent(this, Preferences.class); 
    this.startActivity(intent); 
    } 
} 

CPFragment là trình nghe tùy chọn được chia sẻ của chúng tôi (trong số những thứ khác). Đó là trong mã này, nơi chúng tôi muốn sửa đổi mục nhập/kiểm soát tùy chỉnh tùy chỉnh (nghĩa là, không phải giá trị tùy chọn, thay vào đó là thuộc tính trên điều khiển tùy chọn, ví dụ: CheckBoxPreference). Chúng tôi muốn làm điều đó ở đây vì đây là nơi dữ liệu thích hợp được tính toán.

public class CPFragment extends Fragment implements OnSharedPreferenceChangeListener 
{ 
    public void onSharedPreferenceChanged(SharedPreferences sharedPreferences, String key) { 
    // In response to preference changes, we want to modify the PreferenceActivity controls. 
    // So it seems we would need a reference to the PreferenceActivity subclass "Preferences 
    } 
} 

Và cuối cùng, lớp con PreferenceActivity "Preferences" thực hiện ít hơn so với hiển thị chế độ xem Cài đặt.

public class Preferences extends PreferenceActivity 
{ 
    @Override 
    protected void onCreate(Bundle savedInstanceState) 
    { 
     super.onCreate(savedInstanceState); 
     addPreferencesFromResource(R.xml.preferences_cp); 
    } 
} 

Như tôi đã đề cập, chúng tôi muốn để có thể sửa đổi Preference Tuỳ chỉnh trong CPFragment (như trái ngược với PreferenceActivity). Vì vậy, tôi đã tìm kiếm một số cách để định vị PreferenceActivity khi trả lời như onSharedPreferenceChangeListener trong CPFragment.

+0

Tôi nghĩ rằng bạn đang nhận được downvoted vì câu hỏi là không rõ ràng. Vui lòng làm rõ những gì bạn đang yêu cầu. Bạn đang cố gắng cập nhật hoạt động 'Preferences' từ một' Fragment'? Bạn cũng có thể đăng ký 'OnSharedPreferenceChangeListener' từ hoạt động. –

+0

Hmmm ... không chắc chắn những gì không rõ ràng, tôi tuyên bố "OnSharedPreferenceChangeListener tồn tại trong một đoạn khác (không phải là lớp con PreferenceActivity)". Nhưng trong mảnh khác này tôi cần phải sửa đổi một sở thích tùy chỉnh. Vì vậy, tôi cần một tham chiếu bằng cách nào đó để PreferenceActivity để sửa đổi sở thích tùy chỉnh. –

Trả lời

4

Nếu tôi hiểu chính xác câu hỏi của bạn, bạn có một Activity có tên PreferencesextendsPreferenceActivity. Bạn cũng có một số Fragment đã đăng ký OnSharedPreferenceChangeListener. Bạn cần cập nhật giao diện người dùng trong số PreferencesActivity nhưng bạn không chắc chắn cách thực hiện điều này.

Có phải Fragment được đính kèm với PreferencesActivity? Nếu có, sau đó bạn sẽ có thể làm như sau trong Fragment của bạn:

if (getActivity() instanceof Preferences) { 
    Preferences activity = (Preferences) getActivity(); 
    CheckBoxPreference pref = (CheckBoxPreference) activity.findPreference(getString(R.string.keyAccount)); 
    pref.setSummary("something"); 
} 

Một cách tiếp cận:

Bạn cũng có thể đăng ký một OnSharedPreferenceChangeListener trong bạn PreferencesActivity và bạn sẽ nhận được được thông báo khi tùy chọn thay đổi.Ví dụ:

public class Preferences extends PreferenceActivity implements SharedPreferences.OnSharedPreferenceChangeListener { 

    /* ... */ 

    @Override protected void onStart() { 
    super.onStart(); 
    SharedPreferences prefs = PreferenceManager.getDefaultSharedPreferences(this); 
    prefs.registerOnSharedPreferenceChangeListener(this); 
    } 

    @Override public void onSharedPreferenceChanged(SharedPreferences sharedPreferences, String key) { 
    if (key.equals(getString(R.string.keyAccount))) { 
     CheckBoxPreference pref = (CheckBoxPreference) findPreference(key); 
     pref.setSummary("something"); 
    } 
    } 

    @Override protected void onPause() { 
    super.onPause(); 
    SharedPreferences prefs = PreferenceManager.getDefaultSharedPreferences(this); 
    prefs.unregisterOnSharedPreferenceChangeListener(this); 
    } 

    /* ... */ 

} 

Một số điều cần xem xét dựa trên câu trả lời thay đổi nội dung của bạn:

1) Không bao giờ tạo ra một tài liệu tham khảo static-Activity của bạn. public static CPActivity inst;. Điều này có thể dẫn đến rò rỉ bộ nhớ.

2) Cân nhắc chuyển mã trong số PreferencesActivity thành PreferenceFragment.

3) Vẫn chưa rõ những gì bạn đang cố gắng đạt được. Có phải CheckBoxPreference mà bạn muốn sửa đổi trong CPFragment hoặc PreferencesActivity của mình không?

4) Bạn vẫn nên xem xét sử dụng hai OnSharedPreferenceChangeListener s hoặc EventBus.

+0

Sự hiểu biết của bạn về câu hỏi là chính xác. Tôi có một FragmentActivity mà startActivity khởi tạo PreferenceActivity. Về đề xuất "Phương pháp tiếp cận khác" của bạn, tôi đã đề cập trong bài đăng Bounty đăng ký OnSharedPreferenceChangeListener trong lớp con PreferenceActivity không phải là một lựa chọn tốt. –

+0

Rất tiếc, không có đoạn nào không được đính kèm với PreferenceActivity. Tôi nghĩ rằng một lựa chọn khác sẽ là lưu một tham chiếu đến PreferenceActivity khi startActivity được gọi là ... nhưng tôi không hiểu cách thực hiện điều này. –

+0

Bạn có thể có cả hai 'Fragment' và' Activity' đăng ký một 'OnSharedPreferenceChangeListener'. Bạn không nên tham chiếu 'Hoạt động' không có trong nền trước. Bạn nên đăng một số mã, nếu không tôi không chắc chắn làm thế nào để giúp đỡ. –

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