뷰 가시성이 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'ID가 정의되기 전에는 ID를 참조 할 수 없습니다'라는 규칙에 의해 포착됩니다 .

나는 여기서 명백한 것을 놓치고 있기를 바랍니다.


RelativeLayoutGONE이 아닌 가장 가까운 앵커 뷰를 찾는 메커니즘이 내장되어 있습니다. 나는 진저 브레드까지 확인하고 심지어이 현재의 한 : github.com/aosp-mirror/platform_frameworks_base/blob/...
Miha_x64

답변:


44

LinearLayout에 textview 2와 3을 배치하고 선형 레이아웃을 textview 1 아래에 유지할 수 있습니다.


14
레이아웃 파일에 계층을 추가하는 것은 특히 RelativeLayout 인 경우 항상 나쁜 생각입니다. 더 많이 추가할수록 더 많은 Android가 레이아웃을 나타내는 개체를 생성합니다. 대신 android : layout_alignWithParentIfMissing = "true"와 같은 것을 사용해야합니다. 예를 들어 TableLayout과 같은 다른 레이아웃을 사용할 수도 있습니다.
Francois Dermu

201

다음 태그를 사용할 수 있습니다.

android:layout_alignWithParentIfMissing="true"

문서에서 :

true로 설정하면 layout_toLeftOf, layout_toRightOf 등에 대한 앵커를 찾을 수 없을 때 부모가 앵커로 사용됩니다.


24
이것은 부모와의 정렬이 필요한 경우에만 작동하지만 문제는 부모가 아닌 이전보기와 정렬하는 방법에 관한 것입니다.
dimsuz

@dismuz, 이것은 동적 레이아웃을 관리하는 데 매우 유용하며 예기치 않은 코너 케이스에서 놀라움을 피할 수 있습니다.
ininprsr

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);

"보기"는 무엇입니까? 코드를 업데이트 할 수 있습니까?
CDrosos

8

이 답변은 특정 문제를 해결하지 못하지만 유사한 문제를 해결하므로 누군가에게 도움이되기를 바랍니다.

내 상대 레이아웃이 TextView1에 해당하지 않는 상황이 발생했습니다. 따라서 내 상황에서 TextView2가 GONE이면 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가 Gone이면 공간을 차지하지 않습니다.


1

모든 textView를 수직 방향으로 LinearLayout 아래에 배치하십시오.

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

-3

이를위한 간단한 방법은 알파 0/1을 사용하는 것입니다. 또한 onClickListener가 있으면 비활성화하십시오.


이렇게하면 불필요한 공간이 유지됩니다.
Henrique Monte
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.