简体   繁体   中英

Inline sdk version check in Android XML?

Sometimes, when I want to add SDK 21+ feature to my layout, I need to create whole layout in another file. It's heavy to me because I want to do or check everything in one layout. More of layouts are looking complex and hard to manage. Instead of having two layouts for different SDK versions, can I do something like this:

<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" />

I can make this stuff programmatically but when I should see the view instantly on designer, making it programmatically is not a good way for me. If there is a good practice or idea for this problem can anybody illuminate me?

You can not give your view elevation in your XML and check for your SDK version in your code - if it's over 21 give the view elevation programmatically.

For example:

 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+
 }

Yes you can do that by adding tool target API :

First add: <RootTag xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.com/tools" >

Example:

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

or by name: tools:targetApi="jelly_bean"

If you want your layout directries to be use in different versions, name your files as:

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

/res/layout-v14/layout.xml

/res/layout-v17/layout.xml

Also, if you want to dynamically create element in your code:

You can also use annotations in your java code to make things easy:

First import: import android.annotation.TargetApi;

Then, use this annotation above your method:

@TargetApi(Build.VERSION_CODES.HONEYCOMB)

There are more annotation that you can get help:

@RequiresApi(Build.VERSION_CODES.LOLLIPOP)

Above annotation to warn for methods that are used lower API level. Read more about requiresApi : Android API level annotation for Android libraries

Now, inside your method you can dynamically generate views.

Example from the doc :

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);
    }
}

Read doc for more details about annotations: https://developer.android.com/studio/write/annotations

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM