Sự cố với RelativeLayout khi Chế độ hiển thị là View.GONE


82

Tôi đã nói RelativeLayoutnhư vậy:

<RelativeLayout>
<TextView1/>
<TextView2/> // <-- View.VISIBLE OR View.GONE
<TextView3/>
<TextView4/>
</RelativeLayout>

Mỗi cái TextViewđược neo bên dưới cái trước TextViewvới android:layout_below.

Vấn đề là TextView2 có thể có hoặc không ở đó (hoặc View.VISIBLEhoặc View.GONE); nếu đúng View.VISIBLE, thì tất cả đều ổn, nhưng nếu đúng View.GONE, thì TextView3 cuối cùng sẽ được hiển thị trên đầu TextView1.

Tôi đã thử nhiều cách khác nhau để khắc phục điều này, nhưng mỗi lần bị phát hiện bởi RelativeLayout's', bạn không thể tham chiếu quy tắc id trước khi nó được xác định.

Tôi hy vọng rằng tôi đang thiếu một cái gì đó rõ ràng ở đây.


RelativeLayoutcó cơ chế nhúng để tìm chế độ xem neo không phải GONE gần nhất. Tôi đã kiểm tra xuống Gingerbread và nó hiện diện ngay cả ở đó: github.com/aosp-mirror/platform_frameworks_base/blob/...
Miha_x64

Câu trả lời:


44

Bạn có thể đặt textview 2 và 3 trong LinearLayout và giữ bố cục tuyến tính bên dưới textview 1.


14
Thêm hệ thống phân cấp vào tệp bố cục luôn là một ý tưởng tồi, đặc biệt nếu đó là một RelativeLayout. Bạn càng thêm nhiều Android sẽ tạo ra nhiều Đối tượng để đại diện cho bố cục của bạn. Thay vào đó, bạn nên sử dụng một cái gì đó như android: layout_alignWithParentIfMissing = "true". Bạn cũng có thể cân nhắc sử dụng các bố cục khác như TableLayout chẳng hạn.
Francois Dermu

201

Bạn có thể sử dụng thẻ này:

android:layout_alignWithParentIfMissing="true"

Từ các tài liệu:

Nếu được đặt thành true, giá trị gốc sẽ được sử dụng làm neo khi không thể tìm thấy neo cho layout_toLeftOf, layout_toRightOf, v.v.


24
Điều này chỉ hoạt động khi bạn muốn căn chỉnh với chế độ xem gốc, nhưng câu hỏi đặt ra là làm thế nào để căn chỉnh với chế độ xem trước đó, chứ không phải chế độ xem chính.
dimsuz

@dismuz, điều này sẽ rất hữu ích trong việc quản lý bố cục động và tránh mọi bất ngờ trong các trường hợp góc không lường trước được.
ininprsr

11

tại sao không cập nhật belowthuộc tính của TextView3 khi bạn cập nhật khả năng hiển thị của TextView2? (Tôi giả sử bạn làm điều này trong mã)

cái gì đó như

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

"view" là gì? bạn có thể cập nhật mã của bạn?
CDrosos

8

Câu trả lời này không giải quyết vấn đề cụ thể của bạn, nhưng giải quyết một vấn đề tương tự, vì vậy hy vọng điều này sẽ giúp ích cho ai đó.

Tôi đã gặp phải tình huống trong đó bố cục tương đối của tôi không có bố cục tương đương với TextView1 của bạn. Vì vậy, trong tình huống của tôi, nếu TextView2 là GONE, thì tôi muốn TextView3 được căn chỉnh với phần trên cùng của cha mẹ. Tôi đã giải quyết điều đó bằng cách thêm vào TextView3 thuộc tính android: layout_alignWithParentIfMissing = "true". Xem http://developer.android.com/resources/articles/layout-tricks-efficiency.html .

Rất tiếc, tôi không thấy cách nào để chỉ định một neo căn chỉnh thay thế trừ khi nó là chính.


7

Quên về INVISIBLEhoặc GONE, sử dụng điều này thay thế:

RelativeLayout.LayoutParams params = (RelativeLayout.LayoutParams) view.getLayoutParams();

params.height = 0;

params.setMargins(0,0,0,0);

view.setLayoutParams(params);

4

bạn có thể làm được việc này

<RelativeLayout>
<TextView1/>
<FrameLayout>
  <TextView2/>  // <-- View.VISIBLE OR View.GONE
</FrameLayout>
<TextView3/>
<TextView4/>
</RelativeLayout>

để TextView3 bên dưới FrameLayout này không có nền, vì vậy nếu TextView2 là Gone, nó sẽ không chiếm dung lượng.


1

đặt tất cả các textView trong LinearLayout với hướng dọc.

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

-3

Một hack đơn giản cho việc này là chơi với alpha 0/1. và cũng vô hiệu hóa onClickListener nếu có


Điều này sẽ giữ cho không gian không cần thiết bị chiếm dụng.
Henrique Monte
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.