28

私は2つのImageViewを含むレイアウトを持っています。私はそれらのうちの1つを肖像画に見せ、もう1つを風景に見せたい。リソースを使って達成するにはどうしたらいいですか? (私はそれをプログラム的に設定する方法を知っていますが、リソースを使用して達成するために必要なこの特定の用途)。リソースからのビューの可視性の制御

私は、解像度/レイアウト/ may_layout.xmlに

のようなものを試してみました:RES /値-土地で

... 
<!-- NOTE: 0 and 8 are VISIBLE and GONE respectively --> 
<integer name="visibile_in_portrait">0</integer> 
<integer name="visibile_in_landscape">8</integer> 

:RES /値/ integers.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" 
     ... 
/> 

を/integers.xml:

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

B私は、イメージを膨らませようとしたときにランタイムエラー(インデックスが外れている)を取得します。 android:visibilityステートメントを削除すると、プログラムは実行されますが、両方の画像が表示されます。

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

(なぜそれをプログラムで設定しても私には役に立たないのだろうか?それは、ファイルウィリアムビットマップを使用したアプリウィジェットの自動ランドスケープ/ポートレート切り替えに関係する)。

答えて

23

このトリックを使用すると、スタイルに視認性線を追加し、そのファイルの2つのインスタンスを標準とノーマルモードにすることができます。私は、フォルダ内のファイルvaluesstyles.xmlに意味

は名前s1とスタイルを入れて、その中でandroid:visibility=visibleを入れて、styles.xmlでフォルダvalues-landで名前s1とスタイルを入れて、android:visibility=goneを置きます。

また、フォルダ内のファイルvaluesstyles.xmlに名前s2とスタイルを入れて、その中でandroid:visibility=goneを入れて、styles.xml内のフォルダvalues-landでは名前s2とスタイルを入れて、android:visibility=visibleを置きます。

を入力し、次にs1を第1の画像ビューに、s2を第2の画像ビューに設定します。

Calvinが提供するソリューションも正しいですが、時間の経過とともに変更される可能性がある複雑なレイアウトの場合、1つのレイアウトファイルを持つ方が変更する必要が少なくなります。

+0

ありがとうKeyhan、私はそれを試してここに報告します。このアプローチはこの質問にも役立ちますか? http://stackoverflow.com/questions/9745227/setting-programmatically-the-pixel-size-of-a-remote-imageview私は5つの異なるサイズの2倍のモード(ポートレートとラングスケープ)を持っています。スタイルを使用してImageViewのサイズを制御しますか?このようにして、2つのイメージと5組の方向/ポートレートスタイルの1つのレイアウトを作成します。 (RemoteViewsの限界を回避することは面白くない;-))。 – user1139880

+0

よく機能します。これは大きな助けになった!ありがとうKeyhan。 – user1139880

+0

提案されている解決策は、[Style Resources](http://developer.android.com/guide/topics/resources/style-resource.html) – denispyr

0

これはできません。 (fill_parentを文字列として定義してlayout_widthに使用しようとしたところ、失敗しました。)

なぜ2つのレイアウトを使用しませんか?

  1. RES /レイアウト/ may_layout.xml
  2. RES /レイアウトランド/ may_layout.xml各々が表示する正しいImageViewのを定義

また、複数の言語をサポートする必要がある場合には、値 - 土地を使用すると問題が発生することがあります。 (言語ごとにvalue-xx-landが必要です)

+1

ありがとうございました。ビルド時にテンプレートから自動的に生成できない限り、私はレイアウトの複製を避けようとしていました。 eclipseがそれをサポートしているかどうか、どのように標準化されるかはわかりません。 – user1139880

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 --> 

しかし、あなたがしたい場合は:だから、あなたは、このように、これらの値を含む整数リソースを宣言することができます毎回これらの数値定数を推測するのを止めるためには、次のようにすることができます:

値/整数x

<!-- 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

+0

ではなく、 ' 'と宣言しています。元のアンドロイドの値を可視、不可視、消えたままにするのがよいでしょう(0,1,2、しかし0,4,8) –

+3

それはどのように機能するのかは分かりません。 'View'クラスコードをチェックすると、これらの値(0,1,2)がこのメンバの位置にアクセスするために使われます:' private static final int [] VISIBILITY_FLAGS = {VISIBLE、INVISIBLE、GONE}; '。 0,1,2はVISIBLE、INVISIBLE、GONEのインデックスを表しているので、0,4,8は使用できません。 –

関連する問題