프로그래밍 방식으로 런타임에“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

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

10

@jackofallcode 답변은 정확하지만 한 줄로 작성할 수 있습니다.

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

1
이렇게하면 레이아웃 LayoutParams설정에 대한 참조가 필요하므로 실제로 레이아웃을 변경할 수 없습니다.setLayoutParams
Stef

@Stef, 나는이 솔루션을 하나의 프로젝트에서 사용했습니다. jackofallcode 솔루션이 여기에서 유일하지만, 단순화했습니다. 그러나 이제는 한 줄로 단축하는 것이 좋지 않다고 생각합니다. 예외가 발생하면 운영자가 제기 한 내용을 이해하기가 더 어려울 수 있습니다.
CoolMind

1
@CoolMind 코드를 한 줄로 단축하는 것을 좋아하지 않기 때문에 특히 캐스팅과 관련된 경우 읽기가 더 어렵습니다. 게다가 그것을 내 방식대로 일을하면 추가 변경 :) 만들 수 있습니다
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.