【问题标题】:Inline sdk version check in Android XML?Android XML中的内联sdk版本检查?
【发布时间】:2019-03-16 10:52:57
【问题描述】:

有时,当我想将 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" />

我可以以编程方式制作这些东西,但是当我应该立即在设计器上看到视图时,以编程方式制作它对我来说不是一个好方法。如果有针对此问题的良好做法或想法,任何人都可以启发我吗?

【问题讨论】:

  • 你可以使用app:elevation="xdp"
  • 我没明白你的意思,但更新了问题。你可以检查一下。
  • 不支持的 XML 属性将被忽略(当然假设它们存在于更高版本中)。你不需要包装它
  • 是的,实际上我不擅长 XML 的基础知识,只知道发生了什么。问题是关于“我们可以做出类似的表达吗?”和“Android 的路线图上有类似的东西吗?”

标签: android android-layout


【解决方案1】:

是的,您可以通过添加tool target 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 级别的方法。阅读更多关于requiresApiAndroid API level annotation for Android libraries

现在,在您的方法中,您可以动态生成视图。

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

有关注释的更多详细信息,请阅读文档:https://developer.android.com/studio/write/annotations

【讨论】:

  • 是的,实际上 tools:targetApi="x" 看起来像我要找的东西。但是当我在 SDK 17 设备上测试 targetApi="21" 时,该小部件仍显示在该设备中。别担心,做了一点搜索,但仍然没有得到我缺少的东西。
【解决方案2】:

你不能在你的 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+
 }

【讨论】:

  • 我的问题与海拔无关。如果它是真实的话,那就是生产力。
  • 你能再解释一下,“如果它是真的的话”是什么意思?在我的回答中,我没有回答 spesipic 的问题,我通常是为了检查电话 api 级别是否高于 21
  • 是的,实际上你是对的。我更新了我的问题。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-05-30
  • 2010-12-25
  • 2011-06-01
  • 1970-01-01
相关资源
最近更新 更多