2013-08-24 34 views
8

Tôi hiện đang tạo trang tùy chọn cho ứng dụng của mìnhSwitchPreference và CheckBoxPreference trong mã

Sau khi API-14, chuyển đổi có sẵn. và tôi muốn sử dụng nó để thay thế checkboxpreference trên API14 + thiết bị

Nó rất dễ dàng để sử dụng res/xmlres/xml-14 để có được những tài nguyên xml đúng

Tuy nhiên, trong phần mã hóa, nó không phải là rất thuận tiện để chuyển đổi các tùy theo API.

public class SettingActivity extends PreferenceActivity { 
    private CheckBoxPreference enable; 
    private SwitchPreference enablev14; 

    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
     addPreferencesFromResource(R.xml.setting); 
     if (Build.VERSION.SDK_INT < 14) 
      enable = (CheckBoxPreference) findPreference(key_enable); 
     else 
      enablev14 = (SwitchPreference) findPreference(key_enable); 
    } 
    ... 
} 

Bây giờ cách của tôi là sử dụng mệnh đề if để kiểm tra Build.VERSION và nhận đối tượng tương ứng để xử lý. Nhưng khá bất tiện và khó quản lý mã. Có ai có cách thông minh hơn không?

Trả lời

12

Có lẽ bạn có thể thiết lập một thuộc tính android:key để cả hai SwitchPreference của bạn và CheckBoxPreference xml, chỉ cần như thế này:

<?xml version="1.0" encoding="utf-8"?> 
<PreferenceScreen xmlns:android="http://schemas.android.com/apk/res/android"> 
    <CheckBoxPreference 
     android:key="pref_sync" 
     android:title="@string/pref_sync" 
     android:defaultValue="true" /> 
</PreferenceScreen> 

<?xml version="1.0" encoding="utf-8"?> 
<PreferenceScreen xmlns:android="http://schemas.android.com/apk/res/android"> 
    <SwitchPreference 
     android:key="pref_sync" 
     android:title="@string/pref_sync" 
     android:defaultValue="true" /> 
</PreferenceScreen> 

Và sau đó bạn có thể kiểm tra nếu lợi nhuận quan trọng này đúng hay trên mã của bạn, giống như sau:

public class SettingActivity extends PreferenceActivity { 

@Override 
protected void onCreate(Bundle savedInstanceState) { 
    addPreferencesFromResource(R.xml.setting); 
    PreferenceManager preferenceManager = getPreferenceManager(); 
    if (preferenceManager.getSharedPreferences().getBoolean("pref_sync", true)){ 
     // Your switch is on 
    } else { 
     // Your switch is off 
    } 
    ... 
} 

Hy vọng điều này phù hợp với bạn.

+1

Cảm ơn. Làm việc hoàn hảo –

1

Tùy thuộc vào những gì mã sẽ muốn làm gì với trường hợp sở thích, nó có thể là đơn giản như đúc để Preference thay vì một loại có nguồn gốc cụ thể, ví dụ:

enable = (Preference)findPreference(key_enable); 

mà sau đó sẽ cho phép một cái gì đó như:

enable.setEnabled(true); 

và loại bỏ sự cần thiết phải kiểm tra cấp API trong mã.

6

Trong mã Java của bạn, hãy sử dụng TwoStatePreference, đây là lớp cha mẹ cho cả CheckBoxPreferenceSwitchPreference. Nó có tất cả các phương pháp bạn có thể cần trong trường hợp sử dụng của bạn.

Đây là những gì mẫu mã mà bạn cung cấp sẽ như thế nào:

public class SettingActivity extends PreferenceActivity { 
    private TwoStatePreference enable; 

    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
     addPreferencesFromResource(R.xml.setting); 
     enable = (TwoStatePreference) findPreference(key_enable); 
    } 
    ... 
} 
+0

Nhưng TwoStatePreference đã được thêm vào trong API cấp 14, vì vậy bạn không thể sử dụng nó trong trường hợp bạn cần CheckBoxPreference – BeniBela