根据Android中的屏幕大小以声明方式隐藏视图

时间:2014-06-12 15:08:17

标签: android xml layout

在android xml:ish

有没有办法直接根据xml中的布局大小/方向更改可见性属性?

我在片段中有一个按钮,只有小屏幕尺寸才能看到。在更大的尺寸上,让我们说布局大,我希望它被隐藏。

当然,我可以毫无问题地为此编写代码,但出于学术原因,我想知道它可以做这样的事情。

<Button
     android:id="@+id/btn_check_availability"
     style="@style/product_info_footer_button"
     android:layout_width="fill_parent"
     android:layout_height="35dp"
     android:text="@string/check_availability"
     android:visibility="<magic expression here>" />

由于

// Johan

4 个答案:

答案 0 :(得分:6)

此答案基于provided here by Flávio Faria的解释。

visiblegone等可以将值映射到字符串资源中的相应枚举值 - 这意味着您可以创建visibilty.xml您想要的每个布局的字符串资源,Android将自动为每种屏幕类型解析您想要的那个。

我建议如下:

/res/values/visibilty.xml:

<?xml version="1.0" encoding="utf-8"?>
<resources>
    <!-- Enum values pulled from Android source -->
    <string name="visibility_visible">0</string>
    <string name="visibility_invisible">1</string>
    <string name="visibility_gone">2</string>

    <string name="product_info_footer_button_visibility">@string/visibility_visible</string>
</resources>

/res/values-large/visibilty.xml:

<?xml version="1.0" encoding="utf-8"?>
<resources>
    <string name="product_info_footer_button_visibility">@string/visibility_invisible</string>
</resources>

然后您可以按如下方式引用按钮的可见性:

<Button
     android:id="@+id/btn_check_availability"
     style="@style/product_info_footer_button"
     android:layout_width="fill_parent"
     android:layout_height="35dp"
     android:text="@string/check_availability"
     android:visibility="@string/product_info_footer_button_visibility" />

警告:这取决于具有与AOSP源中定义的可见性(0/1/2)相同的枚举值的设备。设备制造商和自定义ROM创建者可以更改这些值,在这种情况下,此代码可能无法按预期工作。

答案 1 :(得分:2)

android:visibility属性是一个int(与许多属性一样),因此您可以执行以下操作:

在values-port和values-land资源目录中定义名为visibility.xml的资源文件。该文件的内容如下:

值端口/ visibility.xml

<?xml version="1.0" encoding="utf-8"?>
<resources>
    <integer name="buttonvisibility">0</integer> <!-- 0 is the value for android:visible -->
</resources>

值-脊/ visibility.xml

<?xml version="1.0" encoding="utf-8"?>
<resources>
    <integer name="buttonvisibility">1</integer> <!-- 1 is the value for android:invisible -->
</resources>

并在layout.xml中:

<Button
 android:id="@+id/btn_check_availability"
 style="@style/product_info_footer_button"
 android:layout_width="fill_parent"
 android:layout_height="35dp"
 android:text="@string/check_availability"
 android:visibility="@integer/buttonvisibility" />

它的工作原理:btn_check_availability在纵向中可见,在横向中不可见。

注意:此示例使用布局方向作为鉴别器,但您当然可以使用任何资源限定符(如维度,密度等)来执行此操作

答案 2 :(得分:1)

XML中没有可用的魔术表达式。如果只是。

这个问题有两种方法:

a /使用drawable文件夹系统。可以复制和命名可绘制文件夹,使其符合此处规定的约定:Supporting Multiple Screens

b /以编程方式执行。在运行时检查屏幕DPI并相应地显示/隐藏视图。

答案 3 :(得分:0)

您是否考虑过在适当的尺寸/方向布局文件夹中使用包含和多种布局?某些布局可能根本没有按钮或默认隐藏它。

Re-using Layouts with include

Providing Alternative Resources