2017-07-24 19 views
0

我的应用的minSdkVersion是< 17。我想以编程方式更改LinearLayout的位置和方向,而不是定义两个不同的LinearLayout。需要比minSdkVersion更高的API作为布局属性,但不能作为样式项的属性

旧的解决方案:

<LinearLayout 
    android:visibility="gone" 
    android:id="@+id/toolbar_vertical_outside" 
    ... 
    android:layout_height="wrap_content" 
    android:layout_width="wrap_content" 
    android:orientation="vertical" 
    android:layout_alignTop="@id/aView" 
    android:layout_toEndOf="@id/aView" 
    android:layout_toRightOf="@id/aView"> 
    ... 

<LinearLayout 
    android:visibility="gone" 
    android:id="@+id/toolbar_horizontal_inside" 
    android:layout_height="wrap_content" 
    android:layout_width="wrap_content" 
    android:orientation="horizontal" 
    android:layout_alignEnd="@id/aView" 
    android:layout_alignRight="@id/aView" 
    android:layout_alignBottom="@id/aView"> 
    ... 

新的解决方案:

<LinearLayout 
    android:id="@+id/toolbar" 
    ... 
    android:layout_height="wrap_content" 
    android:layout_width="wrap_content" 
    style="@style/Toolbar_VerticalOutside"> 
    ... 

......包括新的风格:

<style name="Toolbar_VerticalOutside"> 
    <item name="android:orientation">vertical</item> 
    <item name="android:layout_alignTop">@id/aView</item> 
    <item name="android:layout_toEndOf">@id/aView</item> 
    <item name="android:layout_toRightOf">@id/aView</item> 
</style> 

<style name="Toolbar_HorizontalInside"> 
    <item name="android:orientation">horizontal</item> 
    <item name="android:layout_alignEnd">@id/aView</item> 
    <item name="android:layout_alignRight">@id/aView</item> 
    <item name="android:layout_alignBottom">@id/aView</item> 
</style> 

问题:对于新的解决方案,Android Studio中抱怨name="android:layout_toEndOf"name="android:layout_alignEnd":“...要求API级别17(当前最小值为14)”。但是它们在布局文件中使用时没有抱怨相同的属性。为什么Android Studio对布局中的新属性比对样式更宽容?我也想在样式中使用新的属性。

回答

1

这只是Android Studio linter的工作方式的一个怪癖。

在你的布局,你已经包括

android:layout_alignEnd="@id/aView" 
    android:layout_alignRight="@id/aView" 

而且你没有警告/错误。那是因为你有都定义了。如果您只删除alignEnd,linter会警告您应该添加alignEnd以支持从右至左的布局。如果删除alignRight,则linter会警告您应该添加alignRight以支持pre-17 API级别。

在样式中,这个“检查两者是否存在”行为不存在。 linter只是单独检查每个<item>,因此它警告alignEnd需要API 17.但是,这不会阻止您的应用程序编译/运行。

如果你真的想成为一个好公民,你可以在两个资源目录中定义两个独立的样式。

/res/values/styles.xml

<style name="Toolbar_HorizontalInside"> 
    <item name="android:orientation">horizontal</item> 
    <item name="android:layout_alignRight">@id/aView</item> 
    <item name="android:layout_alignBottom">@id/aView</item> 
</style> 

/res/values-v17/styles.xml

<style name="Toolbar_HorizontalInside"> 
    <item name="android:orientation">horizontal</item> 
    <item name="android:layout_alignEnd">@id/aView</item> 
    <item name="android:layout_alignBottom">@id/aView</item> 
</style> 
+0

谢谢您的回答!第一部分对我来说已经很清楚了。我不会是一个好公民 - 现在我在代码中以编程方式设置所有这些参数,因为我无法直接更改样式:https://stackoverflow.com/questions/11723881/android-set-view-style-programmatically – Andi