2012-02-29 21 views
25

Pre-API Level 14 không có tùy chọn chuyển đổi. Nếu tôi sử dụng preferences.xml để tạo màn hình tùy chọn của tôi thì có cách nào để phân biệt giữa các cấp API không? Vì vậy, có một hộp kiểm cho các phiên bản cũ và một chuyển đổi cho API 14?Android: Sử dụng Preference Preference API level 14

Điều gì sẽ là cách tốt nhất?

Trả lời

47

Nếu tôi sử dụng preferences.xml để tạo màn hình tùy chọn của mình, có cách nào để phân biệt giữa các cấp API không? Vì vậy, có một hộp kiểm cho các phiên bản cũ và một chuyển đổi cho API 14?

Tạo thư mục res/xml-v14/ có chứa SwitchPreference. Tạo một thư mục res/xml/ có chứa tệp preferences.xml thay thế SwitchPreference bằng một số CheckBoxPreference. Android sẽ tải phiên bản tệp preferences.xml phù hợp dựa trên phiên bản thiết bị mà ứng dụng đang chạy.

+1

Có tương đương với thẻ "bao gồm" của các tệp công khai chưa, đối với tệp tùy chọn? Bằng cách này, chỉ có văn bản tối thiểu sẽ là cần thiết vì đồng bằng sẽ được đặt trong thư mục v14, phải không? –

+0

@androiddeveloper: Xin lỗi, không phải là tôi biết. – CommonsWare

+0

Tôi đã thực hiện một giải pháp tốt cho vấn đề này, kết thúc tốt đẹp switchPreference khi có thể và sử dụng hộp kiểm nếu không thể. Bạn có thể kiểm tra xem nó có ổn không? theo thử nghiệm của tôi, nó hoạt động tốt, nhưng có lẽ tôi đã bỏ lỡ một số chức năng. –

2

Có một workaround mà tôi không chắc chắn cách đầy đủ nó là, bằng cách gói mà xem để sử dụng trong các CheckBoxPreference (có thể bỏ lỡ một số chức năng, nhưng trong sử dụng chung, nó hoạt động).

Giải pháp thay thế sẽ sử dụng CheckBoxPreference cho pre-API-14 và SwitchPreference cho API 14 trở lên.

Dưới đây là các mã:

public class SwitchPreference extends CheckBoxPreference 
    { 
    android.preference.SwitchPreference _switchPreference =null; 

    public SwitchPreference(final Context context) 
    { 
    super(context); 
    if(VERSION.SDK_INT>=VERSION_CODES.ICE_CREAM_SANDWICH) 
     _switchPreference=new android.preference.SwitchPreference(context); 
    } 

    public SwitchPreference(final Context context,final AttributeSet attrs) 
    { 
    super(context,attrs); 
    if(VERSION.SDK_INT>=VERSION_CODES.ICE_CREAM_SANDWICH) 
     _switchPreference=new android.preference.SwitchPreference(context,attrs); 
    } 

    public SwitchPreference(final Context context,final AttributeSet attrs,final int defStyle) 
    { 
    super(context,attrs,defStyle); 
    if(VERSION.SDK_INT>=VERSION_CODES.ICE_CREAM_SANDWICH) 
     _switchPreference=new android.preference.SwitchPreference(context,attrs,defStyle); 
    } 

    @Override 
    protected View onCreateView(final ViewGroup parent) 
    { 
    final View view; 
    if(VERSION.SDK_INT>=VERSION_CODES.ICE_CREAM_SANDWICH) 
     { 
     view=_switchPreference.getView(null,parent); 
     // set as checked the view and the view's children, each in case it extend from Checkable 
     ViewUtil.setChecked(view,isChecked()); 
     // set as non-clickable the view and the view's children 
     ViewUtil.setClickable(view,false); 
     } 
    else view=super.onCreateView(parent); 
    return view; 
    } 
+0

@ 3c71 xin lỗi, nhưng bạn đã sai và tôi nghĩ bạn chưa thử. bạn có thể khai báo bất kỳ loại lớp nào ngay cả khi bạn không có quyền truy cập vào nó vì API khác nhau. bạn sẽ chỉ gặp sự cố nếu bạn sử dụng các phương thức (bao gồm CTOR) của lớp, vì bạn không có quyền truy cập vào chúng. –

+0

Thực ra đây là một giải pháp thông minh và làm việc. Hãy chắc chắn rằng SwitchPreference chỉ là trong gói của riêng bạn và cũng là XML không sử dụng SwitchP ban đầu nhưng mới. Ngoài ra, bạn có thể cần ghi đè một số phương thức khác, ví dụ: isChecked vv Nói cách khác, mục này hoạt động như CheckBoxPreference nhưng trông giống như một SwitchPreference. – digitalfootmark

+0

@digitalfootmark Tôi không chắc chắn. Cho đến bây giờ nó đã làm việc tốt cho tôi. Đây là lý do tại sao tôi đã viết nó không phải là "đầy đủ", vì tôi không chắc chắn chức năng nào nên được thêm vào. Bạn có chắc chắn "isChecked" không hoạt động không? Ý tôi là, tôi thậm chí còn sử dụng nó trong chính mã này ... –

0

Hãy thử mã này:

public class SettingsActivity extends PreferenceActivity { 

    @TargetApi(Build.VERSION_CODES.ICE_CREAM_SANDWICH) 
    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     // setContentView(R.layout.activity_settings); 
     PreferenceScreen rootScreen = getPreferenceManager() 
       .createPreferenceScreen(this); 
     setPreferenceScreen(rootScreen); 
     Preference NotifCheck=null; 
     if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.ICE_CREAM_SANDWICH) { 
      NotifCheck = new SwitchPreference(this); 

     } else { 
      NotifCheck = new CheckBoxPreference(this); 

     } 
     NotifCheck.setKey("ShowNotification"); 
     NotifCheck.setTitle(R.string.ShowNotification); 
     NotifCheck.setEnabled(true); 
     rootScreen.addPreference(NotifCheck); 
     // Show the Up button in the action bar. 
     setupActionBar(); 
    } 
} 
1

bạn có thể sử dụng SwitchCompat:

<android.support.v7.widget.SwitchCompat 
    android:id="@+id/switch_compat" 
    android:layout_width="wrap_content" 
    android:layout_height="wrap_content" 
    android:layout_alignParentRight="true" 
    android:checked="true" 
    android:textOff="OFF" 
    android:textOn="ON" 
    app:showText="false" 
    android:focusable="false" 
    android:focusableInTouchMode="false"/> 

trên setOnCheckedChangeListener:

SwitchCompat switchCompat = (SwitchCompat)convertView.findViewById(R.id.switch_compat); 
     switchCompat.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener() { 
      @Override 
      public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) { 
       if (isChecked) { 
        textView.setText("check"); 
       } else { 
        textView.setText("unCheck"); 
       } 
      } 
     }); 

tôi hy vọng sẽ giúp bạn.

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