2012-07-11 23 views
15

tôi không thể chèn Switch trong dự án của tôi vì các lỗi sau:Android: API bắt buộc để sử dụng Chuyển đổi?

Xem đòi hỏi mức API 14 (hiện tại tối thiểu là 8):

Nhưng trong tính chất dự án của tôi, tôi sử dụng Nền tảng 4.1 và API Cấp 16. Vậy điều gì là sai?

+0

Xem giải pháp tại đây: http://stackoverflow.com/questions/9920709/use-android-4-0-styled-toggle-button/15640365#15640365 – dberm22

Trả lời

74

có một bài giảng tốt đẹp về điều này từ Google IO 2012 (starting at slide 32)

ở đây tôi Ví dụ chi tiết:

Tạo tệp XML bố cục riêng cho phiên bản ICS + bằng cách đặt nó trong/res/layout-v14. Kết quả là cấu trúc tập tin sẽ giống như thế này:

res/layout 
- mainlayout.xml 
- compound_button.xml 
res/layout-v14 
- compound_button.xml 

Android sau đó sẽ tìm kiếm các nguồn tài nguyên trong thư mục layout-v14 khi ứng dụng của bạn đang chạy trên v14 hoặc cao hơn.

Nơi một bao gồm trong mainlayout.xml sẽ kéo trong compound_button.xml thích hợp khi ứng dụng được chạy:

<include layout="@layout/compound_button" /> 

Đối với 4,0 bố trí trước, chúng tôi muốn có một hộp kiểm, vì vậy tạo/layout/compound_button. xml như một hợp nhất như sau:

<?xml version="1.0" encoding="utf-8"?> 
<merge xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent" android:layout_height="match_parent" > 

    <CheckBox 
     android:id="@+id/enabled" 
     android:layout_width="wrap_content" 
     android:layout_height="wrap_content" 
     android:text="Enable" /> 

</merge> 

Và sau đó cho 4.0 + bố trí chúng ta muốn có một công tắc, vì vậy tạo /layout-v14/compound_button.xml như một hợp nhất như sau:

<?xml version="1.0" encoding="utf-8"?> 
<merge xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent" android:layout_height="match_parent" > 

    <Switch 
     android:id="@+id/enabled" 
     android:layout_width="wrap_content" 
     android:layout_height="wrap_content" 
     android:text="Enable" 
     tools:ignore="NewApi" /> 

</merge> 

Tất nhiên, hãy chắc chắn để thiết lập min và mục tiêu của bạn một cách thích hợp:

<uses-sdk android:minSdkVersion="7" android:targetSdkVersion="14" /> 
+0

Vui lòng cung cấp bản tóm tắt về những gì ở liên kết đó. Vui lòng không yêu cầu chúng tôi chuyển đến một trang web khác để hưởng lợi từ câu trả lời của bạn. Và điều gì sẽ xảy ra nếu trang web khác biến mất hoặc ngắt liên kết? –

+0

Công tắc chỉ khả dụng từ API v14 trở lên. Vì vậy, tôi đoán bố trí-v14 nên được sử dụng thay vì bố trí-v11? – Almer

+0

Bạn đúng, Almer. Chuyển đổi đã không được giới thiệu cho đến khi v14 và do đó, bố cục-v14 nên được sử dụng. Đẹp bắt! – suomi35

5

Look cho điều này trong tập tin AndroidManifest.xml của bạn:

<uses-sdk android:minSdkVersion="8" android:targetSdkVersion="16"/> 

Thay đổi minSdkVersion phải 14.

+0

Cảm ơn bạn vì điều này! Tôi không biết nó ở trong tờ kê khai. – Rob

+1

Lưu ý rằng nếu bạn thay đổi minSdkVersion thành 14, ứng dụng của bạn sẽ chỉ hoạt động với điện thoại Android 4.0 trở lên. Hiện tại, chỉ có khoảng 10% số điện thoại Android. – azgolfer

+0

Tôi hiểu rồi. Vì vậy, thay thế tốt nhất cho Switch là gì? Tôi nghĩ rằng tôi sẽ phải đi với một CheckBox. – Rob

1

bạn android:minSdkVersion được thiết lập để 8. Điều này có nghĩa ứng dụng của bạn sẽ chạy trên API-8 (2.2. 1) trở lên nhưng nó sẽ sụp đổ vì Switch là không có sẵn

1

Một giải pháp tốt hơn là để có hai bố cục xml khác nhau trong thư mục bố trí và thư mục trình bày bố cục v14 với cùng tên và cùng mã. Trong bố cục, các hộp kiểm toggleButton/của nó và trong bố cục-v14, công tắc của nó và tự động kiểm tra phiên bản api và thổi phồng bố cục tương ứng.

0

Look có hai cách để giải quyết vấn đề của bạn đầu tiên hoặc là bạn thay đổi minSdkVersion bạn <uses-sdk android:minSdkVersion="8" android:targetSdkVersion="16"/> 8-14 hoặc xác định khác có chứa Chuyển bố trí trong cách bố trí-v14 bạn có thể tạo bằng tay thư mục này trong thư mục res

3

Chuyển đòi hỏi API 14, cho phiên bản cũ, hãy sử dụng SwithCompat:

<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:

witchCompat 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