控制资源的视图可见性



我有一个包含两个ImageView的布局。我希望其中一个在纵向上可见,另一个在横向上可见。如何使用资源实现它?(我知道如何以编程方式设置它,但这种特定用途我需要使用资源来实现它(。

我尝试了类似的东西

在 res/layout/may_layout.xml 中:

...
<ImageView
      android:id="@+id/image1"
      android:visibility="@integer/visible_in_portrait"   <<-- is this allowed?
      ...
/>
<ImageView
      android:id="@+id/image2"
      android:visibility="@integer/visible_in_landscape"   
      ...
/>

在 res/值/整数.xml:

...
<!-- NOTE: 0 and 8 are VISIBLE and GONE respectively -->
<integer name="visibile_in_portrait">0</integer>
<integer name="visibile_in_landscape">8</integer>

在res/values-land/integers.xml中:

...
<integer name="visibile_in_portrait">8</integer>
<integer name="visibile_in_landscape">0</integer>

但是在尝试膨胀图像时出现运行时错误(索引越界(。当我删除android:visibility语句时,程序运行,但我看到了两个图像。

问:使用

资源作为 android:可见性属性的值的方法是什么?

(如果您想知道为什么以编程方式设置它对我没有帮助,它与带有文件 URI 位图的应用程序小部件的自动陆地空间/纵向切换有关(。

这是一个已经被接受的老问题,但以下解决方案可能会对其他人有所帮助:

如果您在 Android 源代码中查看 res/values/attrs.xml,您将看到可见性属性的定义如下:

 <!-- Controls the initial visibility of the view.  -->
    <attr name="visibility">
        <!-- Visible on screen; the default value. -->
        <enum name="visible" value="0" />
        <!-- Not displayed, but taken into account during layout (space is left for it). -->
        <enum name="invisible" value="1" />
        <!-- Completely hidden, as if the view had not been added. -->
        <enum name="gone" value="2" />
    </attr>

此属性需要一个字符串值(可见、不可见、消失(,该值将分别转换为 (0, 1, 2(。因此,您可以声明包含这些值的整数资源,如下所示:

值/整数.xml

<integer name="visible_in_portrait">2</integer> <!-- This is GONE -->

值-土地/整数.xml

<integer name="visible_in_landscape">0</integer> <!-- This is VISIBLE -->

但是,如果您想让它变得更好,以便停止每次都猜测这些数字常量,您可以这样做:

值/整数.xml

<!-- These are alias for the constants we'll reference below -->
<integer name="view_visible">0</integer> <!-- This is VISIBLE -->
<integer name="view_invisible">1</integer> <!-- This is INVISIBLE -->
<integer name="view_gone">2</integer> <!-- This is GONE -->
<integer name="visible_in_portrait">@integer/view_gone</integer> <!-- We're referencing the visibility alias we declared above -->

值-土地/整数.xml

<integer name="visible_in_landscape">@integer/view_visible</integer>

您可以使用此方法或 Keyhan 建议的方法。选择更适合您的一种。

当您使用此技巧时,可以将可见性线添加到样式中,并将该文件的两个实例置于 -land 和正常模式。

我的意思是在文件夹styles.xml中放入values名称为 s1 的样式,并将android:visibility=visible放入其中,然后在文件夹中styles.xml放入values-land放置名称为 s1 的样式,然后放入android:visibility=gone.

此外,在文件夹styles.xml中,values放置名称为 s2 的样式,并将android:visibility=gone放入其中,在styles.xml文件夹中放置名称为 s2 的样式values-land放入 android:visibility=visible

然后,将"s1"设置为"第一个图像视图",s2设置为"第二个"。

亲爱的Calvin给出的解决方案也是正确的,但是当您有一个复杂的布局可能会随着时间的推移而改变时,拥有一个布局文件会更好,并且不需要更改。

这是不可能的。(我尝试将fill_parent定义为字符串并将其用于layout_width,但它也失败了。

为什么不使用 2 种布局?

  1. 分辨率/布局/may_layout.xml
  2. res/layout-land/may_layout.xml

其中每个定义要显示的正确图像视图。

此外,当您需要支持多语言时,拥有价值土地可能会给您带来问题。(您需要为每种语言提供价值 xx-land(

最新更新