Иногда, когда я хочу добавить функцию 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" />
Я могу сделать все это программно, но когда мне нужно сразу увидеть представление дизайнера, сделать это программно не очень хороший способ для меня. Если есть хорошая практика или идея для этой проблемы, кто-нибудь может осветить меня?
Да, вы можете сделать это, добавив 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
Вы не можете указывать свой угол обзора в своем 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+
}