Встроенная проверка версии SDK в Android XML?

1

Иногда, когда я хочу добавить функцию SDK 21+ в свой макет, мне нужно создать весь макет в другом файле. Это тяжело для меня, потому что я хочу сделать или проверить все в одном макете. Больше макетов выглядят сложными и сложными в управлении. Вместо двух макетов для разных версий SDK, я могу сделать что-то вроде этого:

<ImageView
    android:id="@+id/x"
    android:layout_width="16dp"
    android:layout_height="wrap_content"
    <compatibility sdk_higher_than="21">
        android:elevation="xdp" //my problem not about the elevation. Its just an example that pops in my mind about the compatibility.
    </compatibility>
    app:srcCompat="@drawable/ic_x" />

Я могу сделать все это программно, но когда мне нужно сразу увидеть представление дизайнера, сделать это программно не очень хороший способ для меня. Если есть хорошая практика или идея для этой проблемы, кто-нибудь может осветить меня?

Теги:
android-layout

2 ответа

0

Да, вы можете сделать это, добавив API инструмента назначения:

Сначала добавьте: <RootTag xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.com/tools" >

Пример:

<GridLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    tools:targetApi="14" >

или по имени: tools:targetApi="jelly_bean"

Если вы хотите, чтобы ваши макеты использовались в разных версиях, назовите ваши файлы как:

/res/layout/layout.xml - (default directries)

/res/layout-v14/layout.xml

/res/layout-v17/layout.xml

Также, если вы хотите динамически создать элемент в вашем коде:

Вы также можете использовать аннотации в своем Java-коде, чтобы упростить задачу:

Первый импорт: import android.annotation.TargetApi;

Затем используйте эту аннотацию над вашим методом:

@TargetApi(Build.VERSION_CODES.HONEYCOMB)

Есть еще аннотации, по которым вы можете получить помощь:

@RequiresApi(Build.VERSION_CODES.LOLLIPOP)

Над аннотацией для предупреждения для методов, которые используются более низкого уровня API. Узнайте больше о requiresApi: аннотация уровня API Android для библиотек Android

Теперь внутри вашего метода вы можете динамически генерировать представления.

Пример из документа:

private void setUpActionBar() {
    // Make sure we're running on Honeycomb or higher to use ActionBar APIs
    if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.HONEYCOMB) {
        ActionBar actionBar = getActionBar();
        actionBar.setDisplayHomeAsUpEnabled(true);
    }
}

Прочтите документ для получения более подробной информации об аннотациях: https://developer.android.com/studio/write/annotations

  • 0
    Да, на самом деле инструменты: targetApi = "x" выглядят так, как я ищу. Но когда я указываю targetApi = "21" на устройстве SDK 17, этот виджет по-прежнему отображается на этом устройстве. Не волнуйтесь, немного поискал, но так и не понял, чего мне не хватает.
0

Вы не можете указывать свой угол обзора в своем XML файле и проверять версию своего SDK в своем коде - если он превышает 21, программно увеличивайте вид.

Например:

 if (android.os.Build.VERSION.SDK_INT >= android.os.Build.VERSION_CODES.LOLLIPOP) {
    //the API level is above 21 and you can manipulate your view with all the features that available to API level 21+
 }
  • 0
    Мой вопрос не был о возвышении. Речь шла о производительности, если ее истинное слово.
  • 0
    Не могли бы вы еще раз объяснить, что вы подразумеваете под «если это истинное слово»? И в своем ответе я не ответил spesipic для elavation, я сделал это в общем для проверки, если уровень API телефона выше 21
Показать ещё 1 комментарий

Ещё вопросы

Сообщество Overcoder
Наверх
Меню