2012-03-17 80 views
28

我有一个包含两个ImageView的布局。我想让他们中的一个在肖像中可见,而另一个在风景中可见。我如何使用资源实现它? (我知道如何以编程方式设置它,但我需要使用资源来实现它)。从资源控制视图可见性

我想是这样

在res /布局/ may_layout.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

/价值观土地:

... 
<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 /价值/ integers.xml

/integers.xml:

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

B ut当我尝试膨胀图像时,出现运行时错误(索引超出限制)。当我删除android:可见性语句时,程序将运行,但我看到两个图像。

问:什么是使用资源作为Android的一个价值的方式:visibility属性?

(如果你想知道为什么它设置编程不会帮我,它有自动解构/与文件URI位图的应用小部件的肖像转行做)。

回答

23

当您使用此招将有可能,您的知名度行添加到样式,并把该文件的两个实例中-land和正常模式。

我的意思是在文件styles.xml文件夹values把风格的名字s1,并且在把android:visibility=visible,并在文件夹values-landstyles.xml把风格的名字s1,并把android:visibility=gone

此外,在文件styles.xml文件夹values把风格的名字s2,在这放android:visibility=gone,并在styles.xml文件夹values-land把风格的名字s2,并把android:visibility=visible

然后将s1设置为第一个图像并将s2设置为第二个。通过亲爱的卡尔文给出

解决方案也是正确的,但是当你有一个复杂的布局,可能时间内发生变化,有一个布局文件会更好,而且将有较少需要改变。

+0

谢谢凯珊,我会试试看,并在这里报告。这种方法是否也有助于解决这个问题? http://stackoverflow.com/questions/9745227/setting-programmatically-the-pixel-size-of-a-remote-imageview。我有5种不同的尺寸乘以两种模式(纵向和横向)。使用样式也可以控制ImageView的大小?这样,我将有一个布局与两个图像和5对方向/肖像样式。 (围绕RemoteViews的限制工作并不好玩;-))。 – user1139880 2012-03-17 18:08:02

+0

效果很好。这是一个很大的帮助!谢谢凯珊。 – user1139880 2012-03-17 19:08:23

+0

建议的解决方案涉及使用[样式资源](http://developer.android.com/guide/topics/resources/style-resource.html) – denispyr 2013-06-16 21:28:37

0

这是不可能的。 (我试过定义FILL_PARENT为字符串,并用它来layout_width和它失败了。)

你为什么不使用2个布局?

  1. RES /布局/ may_layout.xml
  2. RES /布局,土地/ may_layout.xml

每个定义正确的ImageView显现。

另外,具有价值观的土地可能会导致您的问题,当你需要支持多国语言。 (您需要具有价值-XX-地为每种语言)

+1

谢谢卡尔文。我试图避免重复布局,除非我可以在构建时自动从模板生成它们。不知道eclipse是否支持它,以及它的标准如何。 – user1139880 2012-03-17 18:04:40

39

这是一个已经接受一个老问题,但下面的解决方案可以帮助别人:

如果您在Android源代码RES /价值/ 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)分别。所以,你可以声明包含这样这些值整数资源:

值/ integers.xml

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

值,土地/ integers.xml

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

但是,如果你想为了不再猜测这些数字常数,你甚至可以这样做:

values/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建议。选择一个更适合你的人。

+5

它也可以将它们声明为''而不是'' – TalkLittle 2014-01-01 05:22:14

+0

好的做法是将原始android值保持可见,不可见并消失(不是0,1,2,但是是0,4,8) – 2014-08-19 10:55:59

+3

,这并不是完全可行的。如果您检查View类代码,则使用这些值(0,1和2)来访问此成员的位置:'private static final int [] VISIBILITY_FLAGS = {VISIBLE,INVISIBLE,GONE};'。这就是为什么你不能使用0,4和8,因为0,1和2代表VISIBLE,INVISIBLE和GONE指数。 – 2014-08-19 14:43:24