상대적 레이아웃에서 버튼의 layout_align_parent_right 속성을 프로그래밍 방식으로 설정하는 방법은 무엇입니까?


285

프로그래밍 방식으로 만드는 상대 레이아웃이 있습니다.

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

이제이 상대 레이아웃에 추가하고 싶은 두 개의 버튼이 있습니다. 그러나 문제는 두 버튼이 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 = 새 TextView (act);
세인트 롭슨

18
ID 추가는 어떻습니까?
user2161301 2019 년

1
어떤 경우에하는 것은 buttonRecycleView? 동일한 위젯에 동일하거나 반대의 규칙을 추가하는 것이 문제가되지 않습니까?
János

정렬을 변경하면 업데이트되지 않는 경우 한 번만 작동합니다. 문제가 무엇인지 알 수 있습니까 ??
Shshank Bhong

나는 그것을 사용하려고했지만 내 코드에서 빨간색으로 변 addRule합니까?

12
  1. 참조해야 할 버튼을 만들고 ID를 지정해야합니다. btn1.setId(1);
  2. params 변수를 사용하여 레이아웃에 매개 변수를 추가 할 수 있습니다. 메서드가 있다고 생각 합니다. addRule()LayoutParams객체에 대한 Android Java 문서를 확인하십시오 .

어떤 코드라도 고맙게 생각합니다. 버튼에서 방법을 찾지 못했습니다.
Fahad Ali

setId에 @IdRes로 주석을 달고 있기 때문에 ID 대신 숫자 대신 실제 리소스 ID를 기대하므로 id를 설정해도 도움이되지 않습니다.
케빈 탄

당신이 과거 예를 들어 레이아웃에서 자원 번호를 가지고 collide.i 추측 구글이 그 / 차단해야합니다하지 않습니다 리소스 ID의 기초로 사용할 수에 즉, 다음의 새로운 기능
codeScriber

6

RelativeLayout값이 true 또는 false 인 속성을 추가 하려면 0false 및 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

코 틀린 버전 :

나중에 호출을 단순화 하는 인 픽스 기능 과 함께 이러한 확장을 사용

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
}

그런 다음이를 infix 함수 호출로 사용하십시오.

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.