ビューの可視性がView.GONEの場合のRelativeLayoutの問題


82

私はRelativeLayoutこうして:

<RelativeLayout>
<TextView1/>
<TextView2/> // <-- View.VISIBLE OR View.GONE
<TextView3/>
<TextView4/>
</RelativeLayout>

それぞれがTextView以前の下に固定されているTextViewandroid:layout_below

問題は、TextView2が存在する場合と存在しない場合があることです(View.VISIBLEまたはView.GONE)。の場合View.VISIBLEはすべて問題ありませんが、の場合View.GONEはTextView3がTextView1の上にレンダリングされます。

私はこれを修正するためにさまざまな方法を試しましたが、RelativeLayout「s」に捕まるたびに、「定義される」ルールの前にIDを参照することはできません。

私はここで明白な何かが欠けていることを望んでいます。


RelativeLayout最も近い非GONEアンカービューを見つけるための組み込みメカニズムがあります。Gingerbreadにチェックダウンしましたが、そこにも存在します:github.com/aosp-mirror/platform_frameworks_base/blob/…– Miha_x 6419
1

回答:


44

テキストビュー2と3をLinearLayoutに配置し、線形レイアウトをテキストビュー1の下に維持できます。


14
特にRelativeLayoutの場合、レイアウトファイルに階層を追加することは常に悪い考えです。追加するほど、Androidはレイアウトを表すオブジェクトを作成します。代わりに、android:layout_alignWithParentIfMissing = "true"のようなものを使用する必要があります。たとえば、TableLayoutなどの他のレイアウトの使用を検討することもできます。
Francois Dermu 2016年

203

このタグを使用できます:

android:layout_alignWithParentIfMissing="true"

ドキュメントから:

trueに設定すると、layout_toLeftOf、layout_toRightOfなどのアンカーが見つからない場合に親がアンカーとして使用されます。


24
これは、親との位置合わせが必要な場合にのみ機能しますが、問題は、親ではなく、前のビューと位置合わせする方法に関するものでした。
dimsuz 2015年

@dismuz、これは動的レイアウトの管理に非常に役立ち、予期しないコーナーケースでの予期しない事態を回避します。
ininprsr 2018

11

belowTextView2の可視性を更新するときに、TextView3の属性を更新してみませんか?(私はあなたがコードでこれを行うと仮定します)

何かのようなもの

TextView tv = (TextView) findViewById(R.id.textview3);
RelativeLayout.LayoutParams lp =
    (RelativeLayout.LayoutParams) tv.getLayoutParams();
lp.addRule(RelativeLayout.BELOW, R.id.textview1);
((TextView) view).setLayoutParams(lp);

8

この答えはあなたの特定の問題を解決しませんが、同様の問題を解決するので、うまくいけば、これは誰かを助けるでしょう。

相対レイアウトにTextView1に相当するものがない状況がありました。したがって、私の状況では、TextView2がなくなった場合、TextView3を親の上部に揃えたいと思いました。TextView3に属性android:layout_alignWithParentIfMissing = "true"を追加することで、これを解決しました。http://developer.android.com/resources/articles/layout-tricks-efficiency.htmlを参照してください。

残念ながら、親でない限り、代替の配置アンカーを指定する方法がわかりません。


7

INVISIBLEまたはを忘れてGONE、代わりにこれを使用してください:

RelativeLayout.LayoutParams params = (RelativeLayout.LayoutParams) view.getLayoutParams();

params.height = 0;

params.setMargins(0,0,0,0);

view.setLayoutParams(params);

4

あなたはこれを行うことができます

<RelativeLayout>
<TextView1/>
<FrameLayout>
  <TextView2/>  // <-- View.VISIBLE OR View.GONE
</FrameLayout>
<TextView3/>
<TextView4/>
</RelativeLayout>

背景のないこのFrameLayoutの下にTextView3を置くと、TextView2がなくなった場合、スペースを占有しません。


1

すべてのtextViewを垂直方向のLinearLayoutの下に配置します。

<LinearLayout>
<TextView/>
<TextView/>
<TextView/>
<TextView/>
<TextView/>
<TextView/>
</LinearLayout>

-3

このための簡単なハックは、アルファ0/1で遊ぶことです。また、onClickListenerがある場合は無効にします


これにより、不要なスペースが占有されたままになります。
エンリケモンテ
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.