2011-01-11 41 views
7

Tôi có một PreferenceActivity với một cây 2 mức độ PreferenceScreen s, một cái gì đó như:PreferenceActivity cập nhật tóm tắt

<PreferenceScreen> 
    <PreferenceScreen android:key="A"> 
    <ListPreference/> 
    <EditTextPreference/> 
    </PreferenceScreen> 
    <PreferenceScreen android:key="B"> 
    <ListPreference/> 
    <EditTextPreference/> 
    </PreferenceScreen> 
    ... 
</PreferenceScreen> 

Mỗi phòng trong số các màn hình ưu tiên cấp thấp hơn, ví dụ như, A và B, được thu thập hai mảnh có liên quan của dữ liệu . Tôi muốn tóm tắt cho các mục cha mẹ đó là kết hợp các giá trị hiện tại của hai tùy chọn phụ.

Tôi đã thử thêm onPreferenceChangeListener vào tùy chọn lá và cập nhật tóm tắt từ đó, nhưng dường như không mất. Chế độ ưu đãi đều được tạo lập trình trong phạm vi hoạt động, do đó, tôi đang làm một cái gì đó như thế này trong onCreate:

leafListPref.setOnPreferenceChangeListener(new OnPreferenceChangeListener() { 
     @Override 
     public boolean onPreferenceChange(Preference preference, Object newValue) { 
       // do some work 
       prefScreenA.setSummary(/* get new summary based on newValue */); 
       return true; 
     } 
    }); 

sau đó tôi đã cố gắng để tìm một vị trí nơi tôi có thể được thông báo rằng tôi đã quay trở lại màn hình ưu tiên cấp cao nhất từ một trang con để tôi có thể cập nhật tại thời điểm đó. Tuy nhiên, tôi đang bối rối như thế nào các màn hình cấp thấp hơn đang được hiển thị. Có vẻ như chúng thực sự là các hộp thoại, không đầy đủ Các hoạt động vì onPause/onResume không được gọi khi di chuyển giữa chúng. Có một số phương pháp ở đâu đó mà tôi đang thiếu mà sẽ được gọi khi trở về trang cấp cao nhất?

Tôi cũng đã thử thêm sharedPreferenceChangeListener, như được mô tả here, nhưng điều đó dường như không bao giờ được gọi.

Bất kỳ ai có bất kỳ gợi ý nào về những gì tôi thiếu ở đây, hoặc bất kỳ phương pháp tiếp cận dễ dàng hơn nào tôi bị thiếu?

Trả lời

11

Tôi đã gặp sự cố tương tự và có vẻ như gọi số Activity.onContentChanged() sau khi tóm tắt được thay đổi đã khắc phục được sự cố của tôi.

@Override 
public void onSharedPreferenceChanged(SharedPreferences sp, String key) { 
    // Update summary value 
    EditTextPreference pref = (EditTextPreference)findPreference(key); 
    pref.setSummary(pref.getText()); 
    this.onContentChanged(); 
} 
+0

Cảm ơn đề xuất. Tôi đã ngừng làm việc này một thời gian trước, nhưng tôi sẽ thử nó khi tôi có cơ hội. –

+0

Thật không may điều này đã không làm việc cho tôi. –

+0

hoạt động tốt, cảm ơn – Yahia

0

Sử dụng đoạn mã sau và ghi đè onContentChanged()

public class SettingsActivity extends PreferenceActivity 
    { 
     @Override 
     public void onCreate(Bundle savedInstanceState) { 
      super.onCreate(savedInstanceState); 
      addPreferencesFromResource(R.xml.preferences); 
      setContentView(R.layout.settings_layout); 


      } 

@Override 
    public void onContentChanged() { 
     // put your code here 
     super.onContentChanged(); 
    } 

} 

Hy vọng nó giúp.

0

Tôi cũng phải đối mặt với vấn đề này và cuối cùng tôi đã tìm thấy một giải pháp bằng cách sử dụng giá trị đến từ người nghe. Trong ví dụ của tôi dưới đây (đối với một ListPreference), lần đầu tiên tôi nhận được chỉ số của các giá trị trong mảng ListPreference, sau đó tôi lấy nhãn của giá trị sử dụng chỉ số này:

passwordFrequencyLP.setOnPreferenceChangeListener(new OnPreferenceChangeListener() { 
     @Override 
     public boolean onPreferenceChange(Preference preference, Object newValue) { 
      int newFrequency = Integer.valueOf(newValue.toString()); 

      prefs.edit().putInt("settings_key_password_frequency", newFrequency).commit(); 

      //get the index of the new value selected in the ListPreference array 
      int index = passwordFrequencyLP.findIndexOfValue(String.valueOf(newValue)); 
      //get the label of the new value selected 
      String label = (String) passwordFrequencyLP.getEntries()[index]; 

      passwordFrequencyLP.setSummary(label); 

      makeToast(getResources().getString(R.string.password_frequency_saved)); 
      return true; 
     } 
    }); 

mẹo nhỏ này hoạt động tốt, tôi tìm thấy nhiều giải pháp khả thi khác nhau cho vấn đề này nhưng chỉ có một giải pháp này có hiệu quả đối với tôi.

0

Sau số tiền thử nghiệm và lỗi thực sự asinine, cuối cùng tôi đã tìm thấy câu trả lời trong another SO answer. Đây là dòng ma thuật:

((BaseAdapter)getPreferenceScreen().getRootAdapter()).notifyDataSetChanged(); 

Đặt điều đó vào trình xử lý tùy chọn của bạn, sau đó bạn nên thực hiện.

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