Android: требуется API для использования Switch?

Я не могу вставить Switch в свой проект из-за следующей ошибки:

Для просмотра требуется уровень API 14 (текущий минимум 8):

Но в моих свойствах проекта я использую Platform 4.1 и API Level 16. Итак, что не так?

Ответы

Ответ 1

Есть хорошая лекция об этом от Google IO 2012 (начиная со слайда 32)

Вот подробный пример:

Создайте отдельный XML файл макета для версий ICS +, разместив его в /res/layout -v14. Полученная файловая структура будет выглядеть примерно так:

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

Android будет искать ресурсы в каталоге layout-v14, когда ваше приложение работает на v14 или выше.

Поместите include в файл mainlayout.xml, который будет вытаскивать соответствующий файл compound_button.xml при запуске приложения:

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

Для макета pre 4.0 нам нужен флажок, поэтому создайте /layout/compound _button.xml как слияние следующим образом:

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

А затем для компоновки 4.0+ нам нужен переключатель, поэтому создайте /layout -v14/compound_button.xml как слияние следующим образом:

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

Конечно, не забудьте установить свой минимум и цели соответствующим образом:

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

Ответ 2

Ищите это в файле AndroidManifest.xml:

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

Измените minSdkVersion на 14.

Ответ 3

Для коммутатора требуется API 14, для старой версии используйте 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"/>

на 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");
            }
        }
    });

Я надеюсь помочь вам.

Ответ 4

Ваш android:minSdkVersion установлен в 8. Это означает, что ваше приложение будет работать на API-8 (2.2.1) и выше, но оно будет аварийно, потому что Switch недоступен

Ответ 5

Лучшим решением является наличие двух разных макетов xml в папках макетов и макетов-v14 с одинаковыми именами и одним и тем же кодом. В макетах его toggleButton/checkbox и в layouts-v14 его переключатель и динамически проверяет версию api и раздувает соответствующий макет.

Ответ 6

Посмотрите, есть ли два способа решить вашу проблему: сначала вы измените свой minSdkVersion <uses-sdk android:minSdkVersion="8" android:targetSdkVersion="16"/> с 8 на 14 или определите другой макет, содержащий Switch в макете-v14, вы можете вручную создать эту папку в каталоге res