プログラムで実行時に「android:layout_below」を設定できますか?


回答:


464

はい:

RelativeLayout.LayoutParams params= new RelativeLayout.LayoutParams(ViewGroup.LayoutParams.WRAP_CONTENT,ViewGroup.LayoutParams.WRAP_CONTENT); 
params.addRule(RelativeLayout.BELOW, R.id.below_id);
viewToLayout.setLayoutParams(params);

最初に、コードは高さと幅を指定して新しいレイアウトパラメータを作成します。このaddRuleメソッドは、xmlに相当するものを適切に追加しますandroid:layout_below。次にView#setLayoutParams、これらのパラメーターを設定するビューを呼び出すだけです。


11
なぜこの答えは受け入れられないのですか?とても良い説明です。
Adithya 2013

145

または、ビューの現在のレイアウトパラメータを使用して、それらを変更することもできます。

RelativeLayout.LayoutParams params = (RelativeLayout.LayoutParams) viewToLayout.getLayoutParams();
params.addRule(RelativeLayout.BELOW, R.id.below_id);

14
@EelLeeそれは質問に答えるかなり明確な別の方法です、それが11の賛成票がある理由です。
Alex K

8
これは他の回答よりも多くの賛成票を持つ必要があります。ビューの一貫した動作を維持するにLayoutParamsは、新しいビューを作成するのではなく、既存のものを使用する必要があります。実際、これは正解として受け入れられるべきです。
Alex Karshin 2016年

10

@jackofallcodeの答えは正しいですが、1行で記述できます。

((RelativeLayout.LayoutParams) viewToLayout.getLayoutParams()).addRule(RelativeLayout.BELOW, R.id.below_id);

1
への参照LayoutParamsを設定する必要があるため、実際にレイアウトを変更することはできませんsetLayoutParams
Stef

@Stef、私はこのソリューションを1つのプロジェクトで使用しました。ここではjackofallcodeソリューションしか使用できませんが、簡略化しました。しかし、今では1行に短縮するのは良くないと思います。例外が発生すると、どの演算子がそれを発生させたかを理解するのが難しくなるからです。
CoolMind 2018年

1
@CoolMindコードを1行に短くするのはあまり好きではありません。特にキャストが関係している場合は、読みにくくなります。さらに、私のやり方でそれを行うと、さらに変更を加えることができます:)
jackofallcode

@jackofallcode、あなたに同意してください!クラッシュが発生すると、どの行でエラーが発生したかを理解するのが容易になるため、現在、私はいくつかの行にも書き込みます。
CoolMind

1

インフィックス機能付きのKotlinバージョン

infix fun View.below(view: View) {
      (this.layoutParams as? RelativeLayout.LayoutParams)?.addRule(RelativeLayout.BELOW, view.id)
}

それからあなたは書くことができます:

view1 below view2

または、通常の関数として呼び出すことができます。

view1.below(view2)
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.