2010-04-10 24 views
183

Tôi muốn xác định thứ tự z của các chế độ xem của RelativeLayout trong Android.Xác định thứ tự Z lượt xem của RelativeLayout trong Android

Tôi biết một cách để thực hiện việc này là gọi bringToFront.

Có cách nào tốt hơn để thực hiện việc này không? Nó sẽ là tuyệt vời nếu tôi có thể xác định thứ tự z trong xml bố trí.

+4

Xem .mang ra phía trước(); là anser –

Trả lời

268

Cách dễ nhất đơn giản là chú ý đến thứ tự mà Chế độ xem được thêm vào tệp XML của bạn. Hạ thấp trong tập tin có nghĩa là cao hơn trong trục Z.

Chỉnh sửa: Đây là tài liệu herehere trên trang web dành cho nhà phát triển Android. (Cảm ơn @flightplanner)

+2

Cảm ơn Steve H! Tính năng này có được ghi lại ở đâu đó không? Tôi sẽ không muốn bố cục của tôi phá vỡ trong một phiên bản Android mới. – hpique

+0

Hmm, tôi không chắc chắn. Tôi sẽ đào xung quanh sau để xem những gì tôi có thể tìm thấy. Tuy nhiên, nguyên tắc tương tự cũng được sử dụng ở nơi khác; canvases (được sử dụng cho đồ họa 2d) hoạt động theo cùng một cách. Vì vậy, tôi nghi ngờ điều này sẽ không thay đổi. Tuy nhiên, đó là một điều tốt để kiểm tra. –

+14

Rất tiếc, không phải lúc nào cũng có thể thay đổi. Ví dụ, trong một bố trí tương đối, mỗi phần tử chỉ có thể được đặt ra đối với những phần tử được định nghĩa trước đó trong tệp – Casebash

76

Nếu bạn muốn làm điều này trong mã bạn có thể làm

View.bringToFront(); 

thấy docs

13

tôi gặp phải những vấn đề tương tự: Trong một parentView bố trí tương đối, tôi có 2 trẻ em childView1 và childView2. Lúc đầu, tôi đặt childView1 ở trên childView2 và tôi muốn childView1 nằm trên childView2. Thay đổi thứ tự quan điểm của trẻ em không giải quyết được vấn đề cho tôi. Có gì làm việc cho tôi là để thiết lập android: clipChildren = "false" trên parentView và trong đoạn code tôi thiết lập:

childView1.bringToFront(); 

parentView.invalidate(); 
+2

Tính năng này đang hoạt động và Android khiến tôi rất buồn. 'child.bringToFront()' với 'parent.invalidate()' làm việc, nhưng 'parent.bringChildToFront (child)' thì không. Đâu là logic mà tất cả chúng ta mong đợi từ một hệ điều hành? –

+2

Trong một 'LinearLayout' là messes lên thứ tự trẻ em ... –

10

Xin lưu ý rằng bạn có thể sử dụng view.setZ(float) bắt đầu từ cấp độ API 21. Here bạn có thể tìm thêm thông tin.

+0

setz không có sẵn dưới mức API 21. và bringtoFront() có vấn đề nhấp nháy. bất kỳ ý tưởng để đạt được như vậy? –

8

Nghĩ rằng tôi muốn thêm một câu trả lời từ sự ra đời của

android: translationZ

lĩnh vực XML thay đổi mọi thứ một chút. Các câu trả lời khác đề xuất chạy

childView1.bringToFront(); 

parentView.invalidate(); 

là hoàn toàn tại chỗ trên EXCEPT cho rằng mã này sẽ KHÔNG mang childView1 trước bất kỳ chế độ xem nào có mã hóa android: hardZ được mã hóa trong tệp XML. Tôi đã có vấn đề với điều này, và một khi tôi loại bỏ lĩnh vực này từ các quan điểm khác, bringToFront() làm việc tốt.

+0

điều này cũng đúng đối với 'elevation' của android 5 – shelll

1

Bạn có thể sử dụng tùy chỉnh RelativeLayout với định nghĩa lại

protected int getChildDrawingOrder (int childCount, int i)

Hãy nhận biết - Phương pháp này có param i là "mà xem tôi nên vẽ i'th". Đây là cách hoạt động của ViewPager. Nó đặt lệnh vẽ tùy chỉnh trong conjuction với PageTransformer.

2

childView.bringToFront() không làm việc cho tôi, vì vậy tôi thiết lập các dịch Z của mặt hàng đó được thêm gần đây nhất (một trong đó đã bao phủ tất cả những đứa trẻ khác) đến một giá trị tiêu cực như vậy:

lastView.setTranslationZ(-10);

thấy https://developer.android.com/reference/android/view/View.html#setTranslationZ(float) Để biết thêm chi tiết

+0

Cảm ơn, điều này đã giúp tôi vẽ Chế độ xem ở trên cùng của thanh điều hướng gốc. Vì lý do nào đó, thanh đã ở trên mọi thứ mặc dù vị trí của nó trong xml – Granjero

+0

Cảm ơn, chỉ hoạt động đối với API 21 trở lên. – noe

10

Trong Android bắt đầu từ cấp API 21, các mục trong tệp bố cục có thứ tự Z của chúng từ cách chúng được sắp xếp trong tệp, như được mô tả trong câu trả lời chính xác và từ độ cao của chúng, giá trị độ cao cao hơn có nghĩa là mục nhận được thứ tự Z cao hơn.

Điều này đôi khi có thể gây ra sự cố, đặc biệt là với các nút thường xuất hiện trên đầu các mục theo thứ tự của XML phải nằm bên dưới chúng theo thứ tự Z. Để khắc phục điều này, chỉ cần đặt android:elevation các mục trong XML bố cục của bạn để khớp với thứ tự Z bạn muốn đạt được.

Tôi đặt độ cao của phần tử trong bố cục sẽ bắt đầu đổ bóng. Nếu bạn không muốn hiệu ứng này, bạn có thể xóa bóng bằng mã như sau:

if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) { 
    myView.setOutlineProvider(null); 
} 

Tôi chưa tìm thấy cách nào để xóa bóng của chế độ xem nâng cao qua bố cục xml.

32

Xin lưu ý, các nút và các yếu tố khác trong API 21 trở lên có độ cao cao và do đó bỏ qua thứ tự xml của các phần tử bất kể bố cục gốc. Đã cho tôi một thời gian để tìm ra một.

+5

vâng nó thực sự. Đã cho tôi giờ để nhận ra nó .. – aldok

+4

giải pháp cho lỗi này cho tôi là gọi setElevation (1000) trên màn hình mà tôi muốn được hiển thị trên nút. – Shaegorath

+0

Cảm ơn bạn. Tôi gãi đầu một lúc trước khi đọc câu trả lời của bạn, sau đó hiểu tại sao một nút được hiển thị phía trên Chế độ xem quảng cáo được thêm sau. – Hong

2

API 21 có view.setElevation(float) build-in

Sử dụng ViewCompat.setElevation(view, float); cho tương thích ngược

Nhiều phương pháp ViewCompat.setZ(v, pixels)ViewCompat.setTranslationZ(v, pixels)

Anther cách thu thập các nút hoặc xem mảng và thêm nó vào cuối

Các vấn đề liên quan