Android 从资源视图控制视图可见性

Android 从资源视图控制视图可见性,android,android-imageview,android-view,android-resources,Android,Android Imageview,Android View,Android Resources,我有一个包含两个ImageView的布局。我希望其中一个在肖像中可见,另一个在风景中可见。我如何使用资源实现它?(我知道如何以编程方式设置它,但我需要使用资源来实现这个特定用途) 我试过类似的东西 在res/layout/may_layout.xml中: ... <ImageView android:id="@+id/image1" android:visibility="@integer/visible_in_portrait" <<-- is t

我有一个包含两个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/layout/may_layout.xml
  • res/layout land/may_layout.xml
  • 其中每个定义了要显示的正确图像视图


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

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

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

    另外,在文件夹
    values
    中的文件
    styles.xml
    中放置一个名为
    s2
    的样式,并在其中放置
    android:visibility=gone
    ,在文件夹
    values land
    中放置一个名为
    s2
    的样式,然后放置
    android:visibility=visibility

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


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

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

    如果在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)。因此,您可以声明包含以下值的整数资源:

     <!-- 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>
    
    value/integers.xml

    <integer name="visible_in_portrait">2</integer> <!-- This is GONE -->
    
    <integer name="visible_in_landscape">0</integer> <!-- This is VISIBLE -->
    
    <!-- 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 -->
    
    <integer name="visible_in_landscape">@integer/view_visible</integer>
    
    2
    
    值land/integers.xml

    <integer name="visible_in_portrait">2</integer> <!-- This is GONE -->
    
    <integer name="visible_in_landscape">0</integer> <!-- This is VISIBLE -->
    
    <!-- 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 -->
    
    <integer name="visible_in_landscape">@integer/view_visible</integer>
    
    0
    
    但是,如果您想让它变得更好,以停止每次猜测这些数值常量,您可以这样做:

     <!-- 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>
    
    value/integers.xml

    <integer name="visible_in_portrait">2</integer> <!-- This is GONE -->
    
    <integer name="visible_in_landscape">0</integer> <!-- This is VISIBLE -->
    
    <!-- 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 -->
    
    <integer name="visible_in_landscape">@integer/view_visible</integer>
    
    
    0
    1.
    2.
    @整数/视图\u已消失
    
    值land/integers.xml

    <integer name="visible_in_portrait">2</integer> <!-- This is GONE -->
    
    <integer name="visible_in_landscape">0</integer> <!-- This is VISIBLE -->
    
    <!-- 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 -->
    
    <integer name="visible_in_landscape">@integer/view_visible</integer>
    
    @integer/view\u可见
    

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

    谢谢卡尔文。我试图避免重复布局,除非我可以在构建时从模板自动生成它们。我不知道eclipse是否支持它以及它的标准有多高。谢谢Keyhan,我将尝试一下并在这里报告。这种方法也有助于解决这个问题吗。我有5种不同的尺寸乘以两种模式(肖像和langscape)。是否还使用样式来控制ImageView的大小?这样,我将有一个单一的布局,有两个图像和5对方向/肖像样式。(绕过RemoteView的限制并不有趣;-)。效果很好。这帮了大忙!。谢谢Keyhan。建议的解决方案包括使用创建一个整体样式来设置属性,这不是一个好的做法,特别是如果您需要在样式中设置更多属性(一个视图中不能有两个样式)。更干净。它还可以将它们声明为
    而不是
    。好的做法是将原始的android值保持为可见、不可见和消失(不是0、1、2,而是0、4、8)。好吧,这不是它的具体工作方式。如果检查
    视图
    类代码,则这些值(0、1和2)用于访问此成员的位置:
    private static final int[]VISIBILITY\u FLAGS={VISIBLE,INVISIBLE,GONE}。这就是为什么不能使用0、4和8,因为0、1和2代表可见、不可见和消失的索引。别名对我不起作用(即
    view\u VISIBLE
    )。仅当我将0、1、2分配给直接使用的整数资源时,它才起作用。(但该位为+1!!)来自
    android.view.view#VISIBLE``android.view.view#VISIBLE
    android.view.view#GONE
    变量值应为