2012-03-17 128 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