プログラムで相対レイアウトのボタンのlayout_align_parent_right属性を設定するにはどうすればよいですか?


285

私がプログラムで作成している相対レイアウトがあります:

 RelativeLayout layout = new RelativeLayout( this );
    RelativeLayout.LayoutParams params = new RelativeLayout.LayoutParams(LayoutParams.FILL_PARENT,
            LayoutParams.WRAP_CONTENT);

これで、この相対レイアウトに追加したい2つのボタンができました。しかし、問題は、両方のボタンがRelatiiveLayoutの左側に重なって表示されていることです。

buttonContainer.addView(btn1);
buttonContainer.addView(btn2);

次に、XMLで行うように、プログラムでボタンのandroid:layout_alignParentRight="true"または android:layout_toLeftOf="@id/btn"属性を設定する方法を教えてください。

回答:


638

を使用してLayoutParams、コードから任意のものにアクセスできますView.getLayoutParams。あなたはあなたが何LayoutParamsにアクセスしているのかを非常に意識している必要があります。これは通常、包含に内部の子ViewGroupがあるかどうかをチェックすることで達成されLayoutParamsます。あなたの場合はそれRelativeLayout.LayoutParamsです。あなたは使用RelativeLayout.LayoutParams#addRule(int verb)しますRelativeLayout.LayoutParams#addRule(int verb, int anchor)

あなたはコードを介してそれに到達することができます:

RelativeLayout.LayoutParams params = (RelativeLayout.LayoutParams)button.getLayoutParams();
params.addRule(RelativeLayout.ALIGN_PARENT_RIGHT);
params.addRule(RelativeLayout.LEFT_OF, R.id.id_to_be_left_of);

button.setLayoutParams(params); //causes layout update

1
アンカーにIDがない場合はどうなりますか?params.addRule(RelativeLayout.LEFT_OF、R.id.id_to_be_left_of); TextView tvUserName = new TextView(act);
セントロブソン

18
IDを追加するのはどうですか?
user2161301

1
にある場合buttonはどうなりRecycleViewますか?同じウィジェットに同じまたは反対のルールを追加するのは問題ではないですか?
ヤーノシュ

一度だけ機能しますが、アラインメントを変更しても更新されません。何が問題になるのでしょうか?
Shshank Bhong、2018

私はそれを使ってみましたが、私のコードで赤くなりaddRuleますか?

12
  1. 参照する必要のあるボタンのIDを作成する必要があります。 btn1.setId(1);
  2. params変数を使用してレイアウトにパラメーターを追加できます。メソッドはだと思います。addRule()このLayoutParamsオブジェクトのAndroid Javaドキュメントを確認してください 。

どんなコードでも大歓迎です。ボタンにメソッドが見つかりません。
Fahad Ali、

setIdは@IdResで注釈が付けられているため、IDの設定は数値ではなく実際のリソースIDを想定しているため、役に立ちません。
Kevin Tan、

過去にあなたが例えばレイアウトからリソース番号を取ることができるとcollide.i推測Googleはその/ブロックされている必要がありませんリソースIDのベースとしてそれを使用し、新機能その
codeScriber

6

RelativeLayout値がtrueまたはfalseの属性を追加するには0、falseおよびRelativeLayout.TRUEtrueを使用します。

RelativeLayout.LayoutParams params = (RelativeLayout.LayoutParams) button.getLayoutParams()
params.addRule(RelativeLayout.ALIGN_PARENT_RIGHT, RelativeLayout.TRUE)

属性がすでに追加されているかどうかは関係ありませんが、属性addRule(verb, subject)を有効/無効にするために引き続き使用します。ただし、使用できるAPI 17以降removeRule(verb)はのショートカットにすぎませんaddRule(verb, 0)


0

Kotlinバージョン:

これらの拡張機能を後の呼び出しを簡略化する中置関数で使用する

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

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

infix fun View.alightParentRightIs(aligned: Boolean) {
    val layoutParams = this.layoutParams as? RelativeLayout.LayoutParams
    if (aligned) {
        (this.layoutParams as? RelativeLayout.LayoutParams)?.addRule(RelativeLayout.ALIGN_PARENT_RIGHT)
    } else {
        (this.layoutParams as? RelativeLayout.LayoutParams)?.addRule(RelativeLayout.ALIGN_PARENT_RIGHT, 0)
    }
    this.layoutParams = layoutParams
}

次に、それらを中置関数呼び出しとして使用します。

view1 below view2
view1 leftOf view2
view1 alightParentRightIs true

または、それらを通常の関数として使用できます。

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