web-dev-qa-db-ja.com

リソースからのビューの可視性の制御

2つの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ステートメントを削除すると、プログラムは実行されますが、両方の画像が表示されます。

Q:Android:visibility属性の値としてリソースを使用する方法は何ですか?

(プログラムで設定しても役に立たないのはなぜか疑問に思われる場合は、ファイルuriビットマップを使用したアプリウィジェットの自動ランドスペース/ポートレート切り替えと関係があります)。

37
user1139880

このトリックを使用して、可視性の線をスタイルに追加し、そのファイルの2つのインスタンスを-landモードと通常モードにすると可能になります。

つまり、ファイルstyles.xmlのフォルダーvaluess1という名前のスタイルを入れてAndroid:visibility=visibleをその中に入れ、styles.xmlのフォルダーvalues-lands1という名前のスタイルを入れてAndroid:visibility=goneを入れます。

また、ファイルstyles.xmlのフォルダーvaluess2という名前のスタイルを入れてAndroid:visibility=goneをその中に入れ、styles.xmlのフォルダーvalues-lands2という名前のスタイルを入れてAndroid:visibility=visibleを入れます。

次に、s1を最初のimageviewに設定し、s2を2番目に設定します。

親愛なるCalvinによって与えられた解決策も正しいですが、時間の経過とともに変更される可能性のある複雑なレイアウトがある場合は、1つのレイアウトファイルを使用する方が適切であり、変更する必要が少なくなります。

26
Keyhan Asghari

これはすでに受け入れられている古い質問ですが、次の解決策は他の誰かを助けるかもしれません:

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)に変換される文字列値(visible、invisible、gone)を想定しています。したがって、次のようにこれらの値を含む整数リソースを宣言できます。

values/integers.xml

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

値-land/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 -->

値-land/integers.xml

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

このアプローチまたはKeyhanによって提案されたアプローチを使用できます。自分に合ったものを選択してください。

56
Flávio Faria

それは不可能。 (fill_parentを文字列として定義し、それをlayout_widthに使用しようとしましたが、失敗しました。)

2つのレイアウトを使ってみませんか?

  1. res/layout/may_layout.xml
  2. res/layout-land/may_layout.xml

それぞれが表示する正しいイメージビューを定義します。

さらに、values-landがあると、多言語をサポートする必要があるときに問題が発生する可能性があります。 (言語ごとにvalue-xx-landが必要です)

0
Calvin