我有一个包含两个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 / values / integers.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:visibility属性的值的方法是什么?
(如果你想知道为什么以编程方式设置它将无法帮助我,它与使用文件uri位图的app小部件的自动landspace / portrait切换有关。)
答案 0 :(得分:49)
这是一个已被接受的旧问题,但以下解决方案可能会帮助其他人:
如果你在Android源代码中检查res / values / attrs.xml,你会看到visibility属性的定义如下:
<!-- 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)的字符串值(可见,不可见,消失)。因此,您可以声明包含这些值的整数资源,如下所示:
值/ integers.xml
<integer name="visible_in_portrait">2</integer> <!-- This is GONE -->
值-脊/ integers.xml
<integer name="visible_in_landscape">0</integer> <!-- This is VISIBLE -->
但是,如果你想让它更好,以便每次都停止猜测这些数字常量,你可以这样做:
值/ integers.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 -->
值-脊/ integers.xml
<integer name="visible_in_landscape">@integer/view_visible</integer>
您可以使用此方法或Keyhan建议的方法。选择最适合你的那个。
答案 1 :(得分:26)
当您使用此技巧时,可以将可见性行添加到样式中,并将该文件的两个实例放在-land和normal模式中。
我的意思是在文件夹styles.xml
中的文件values
中放置一个名为s1
的样式,并将android:visibility=visible
放入其中,并放在文件夹styles.xml
中{ {1}}添加名为values-land
的样式,并放置s1
。
此外,在文件夹android:visibility=gone
的文件styles.xml
中添加名称为values
的样式,并将s2
放入其中,并在文件夹android:visibility=gone
中{ {1}}添加名为styles.xml
的样式,并放置values-land
。
然后,将s2
设置为第一个imageview,将android:visibility=visible
设置为第二个。
答案 2 :(得分:0)
这是不可能的。 (我尝试将fill_parent定义为字符串并将其用于layout_width,但也失败了。)
为什么不使用2种布局?
每个都定义了要显示的正确图像视图。
此外,当您需要支持多语言时,拥有value-land可能会导致问题。 (您需要为每种语言设置value-xx-land)