Làm thế nào để đưa quan điểm trước mọi thứ?


130

Tôi có hoạt động và rất nhiều vật dụng trên đó, một số trong số chúng có hình động và do hình động mà một số vật dụng đang di chuyển (dịch) cái này sang cái khác. Ví dụ, chế độ xem văn bản đang di chuyển qua một số nút. . .

Bây giờ điều tôi muốn các nút luôn ở phía trước. Và khi textview đang di chuyển tôi muốn di chuyển phía sau các nút.

Tôi không thể đạt được điều này Tôi đã thử mọi thứ tôi biết và "bringToFront ()" definitelly không hoạt động.

lưu ý Tôi không muốn kiểm soát thứ tự z theo thứ tự đặt phần tử vào bố cục vì đơn giản là tôi không thể :), bố cục phức tạp và tôi không thể đặt tất cả các nút theo cách bố trí của bố cục


3
Tôi đã sử dụng một RelativeLayoutchế độ xem "trên cùng" xuất hiện cuối cùng trong XML. Xem stackoverflow.com/a/31340762/1121497
Ferran Maylinch

bất cứ ai có thể vui lòng cho biết mã tương ứng trong xml của 'bringToFront'
Shirish Herwade

Hãy thử sử dụng độ cao bottomView = elevation: 1dp và topView = elevation: 2dp trong xml của bạn || ViewCompat.setElevation (Xem, int)
Tlacaelel Ramon Luis 7/12/18

Câu trả lời:


144

Bạn có thể gọi bringToFront () trên chế độ xem bạn muốn nhận ở phía trước

Đây là một ví dụ:

    yourView.bringToFront();

4
Kết quả không như mong đợi: Tôi đã sử dụng nó trong bố cục tuyến tính dọc và chế độ xem được đưa ra phía trước xuất hiện ở phía dưới ... Ví dụ: tôi đã A / B / Cvà muốn đưa Ara phía trước, vì vậy sau khi chạy, a.bringToFront()tôi đã kết thúc với bố cục như thế nào B / C / A.
Ferran Maylinch 10/07/2015

2
Vì vậy, tôi thấy LinearLayoutkhông thể được sử dụng với bringToFront. Tôi đã kết thúc bằng cách sử dụng một RelativeLayout. Xem nhận xét của tôi về chính câu hỏi.
Ferran Maylinch

1
bất cứ ai có thể vui lòng cho biết mã tương ứng trong xml của 'bringToFront'
Shirish Herwade

Điều này dẫn đến việc định vị lại yếu tố tôi đang di chuyển lên phía trước vì bất kỳ lý do gì. ViewCompat.setTranslationZ(view, 1)hoạt động hoàn hảo mặt khác.
Bimde

1
nếu tôi đã sử dụng trong tệp kê khai android: theme = "@ android: style / Theme.Light.NoTitleBar" trong hoạt động hơn yourView.bringToFront (); hoạt động hoàn hảo, nhưng tôi đã sử dụng android: theme = "@ android: style / Theme.AppCompat.Light.NoActionBar" yourView.bringToFront (); không hoạt động. Bất kỳ manh mối về điều đó.
Raul

41

Tôi đã xem qua stack stack để tìm một câu trả lời hay và khi tôi không thể tìm thấy tôi đã xem qua các tài liệu.

dường như không ai vấp phải câu trả lời đơn giản này:

ViewCompat.setTranslationZ(view, translationZ);

z dịch mặc định là 0,0


Đó là vị trí của phần tử trên trục Z tính bằng px, còn được gọi là độ cao. setTranslationX sẽ di chuyển chế độ xem dọc theo trục X (trái / phải), setTranslationY dọc theo trục Y (trên / dưới). Trục Z là trục thứ 3.
xdevs23

Thế còn setZ()? Nếu tôi nhớ lại chính xác, vị trí Z của chế độ xem là độ cao của nó cộng với bản dịch Z của nó, sau tất cả.
Gensoukyou1337

2
@ Gensoukyou1337, sau đó ViewCompat.setZ(view, yourValueInPixels); view.setZ()chỉ hoạt động trên API 21 trở lên.
Johnny Năm

1
Đã kiểm tra mã Java 8 trong Android Studio - nó chỉ kiểm tra nếu SDK_INT> = 21, vì vậy đối với <21 api, nó không có hiệu lực.
Vadim

32

Một giải pháp thậm chí đơn giản hơn là chỉnh sửa XML của hoạt động. Sử dụng

android:translationZ=""

3
Điều này chỉ hữu ích trong API Android 21 trở lên.
isakbob

25

bringToFront()là cách đúng, nhưng, LƯU Ý rằng bạn phải gọi bringToFront()invalidate()phương thức trên chế độ xem cấp cao nhất (dưới chế độ xem gốc của bạn), ví dụ:

Hệ thống phân cấp của chế độ xem của bạn là:

-RelativeLayout
|--LinearLayout1
|------Button1
|------Button2
|------Button3
|--ImageView
|--LinearLayout2
|------Button4
|------Button5
|------Button6

Vì vậy, khi bạn làm động lại các nút của mình (1-> 6), các nút của bạn sẽ nằm dưới (bên dưới) ImageView. Để đưa nó qua (ở trên), ImageViewbạn phải gọi bringToFront()invalidate()phương thức trên LinearLayouts của bạn . Sau đó, nó sẽ hoạt động :) ** LƯU Ý: Hãy nhớ đặt android:clipChildren="false"bố cục gốc hoặc gradparent_layout của animate-view. Hãy xem mã thực sự của tôi:

.xml

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:hw="http://schemas.android.com/apk/res-auto"
    android:id="@+id/layout_parent"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:background="@color/common_theme_color"
    android:orientation="vertical" >

    <com.binh.helloworld.customviews.HWActionBar
        android:id="@+id/action_bar"
        android:layout_width="match_parent"
        android:layout_height="@dimen/dimen_actionbar_height"
        android:layout_alignParentTop="true"
        hw:titleText="@string/app_name" >
    </com.binh.helloworld.customviews.HWActionBar>

    <RelativeLayout
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:layout_below="@id/action_bar"
        android:clipChildren="false" >

        <LinearLayout
            android:id="@+id/layout_top"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:layout_alignParentTop="true"
            android:gravity="center_horizontal"
            android:orientation="horizontal" >
        </LinearLayout>

        <ImageView
            android:id="@+id/imgv_main"
            android:layout_width="@dimen/common_imgv_height"
            android:layout_height="@dimen/common_imgv_height"
            android:layout_centerInParent="true"
            android:contentDescription="@string/app_name"
            android:src="@drawable/ic_launcher" />

        <LinearLayout
            android:id="@+id/layout_bottom"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:layout_alignParentBottom="true"
            android:gravity="center_horizontal"
            android:orientation="horizontal" >
        </LinearLayout>
    </RelativeLayout>

</RelativeLayout>

Một số mã trong .java

private LinearLayout layoutTop, layoutBottom;
...
layoutTop = (LinearLayout) rootView.findViewById(R.id.layout_top);
layoutBottom = (LinearLayout) rootView.findViewById(R.id.layout_bottom);
...
//when animate back
//dragedView is my layoutTop's child view (i added programmatically) (like buttons in above example) 
dragedView.setVisibility(View.GONE);
layoutTop.bringToFront();
layoutTop.invalidate();
dragedView.startAnimation(animation); // TranslateAnimation
dragedView.setVisibility(View.VISIBLE);

GLuck!


Điều gì nếu bạn chỉ muốn đưa nút 6 lên trên chế độ xem hình ảnh chứ không phải các nút khác?
Adam Katz

@AdamKatz: Tôi nghĩ bạn phải tổ chức lại chúng thành một cấp độ khác. Sau đó, mang nó theo cách của bạn.
Justin

cảm ơn tôi đang cố gắng chỉ mang một mục của chế độ xem tái chế phía trên chế độ xem nhưng để các mục khác bên dưới nó, khá bị kẹt!
Adam Katz

Tôi đã sử dụng tương tự. Nó hoạt động tốt với một vấn đề duy nhất là nó ẩn thanh công cụ.
dùng2980181

Điều này có làm việc với nhiều cấp độ? Giả sử tôi có một ConstraintLayoutcái chứa một RelativeLayoutvà một cái khác RelativeLayout, cả hai đều có cùng kích thước với gốc của nó ConstraintLayout( match_parent). Cái đầu tiên RelativeLayoutcó một Button, và cũng đứng sau (z-order-khôn ngoan) cái thứ hai RelativeLayout. Tôi có thể làm cho cái Buttonđầu tiên RelativeLayoutxuất hiện như thể nó ở trên tất cả mọi thứ, sao cho nó có thể nhìn thấy và có thể nhấp được, bằng cách sử dụng View::bringToFront()?
oaskamay

25

Với mã này trong xml

 android:translationZ="90dp"

3
Nơi nào đã 90dpđến?
Sudhir Khanger

1
đó là nhập thủ công. Bạn có thể thử với yêu cầu của bạn. hoặc 45dp hoặc 135dp hoặc 180dp hoặc 270dp
Krishna

Bạn không thể sử dụng 1dp sao?
Tyler Turnbull

18

Hãy thử FrameLayout, nó cung cấp cho bạn khả năng đặt lượt xem lên trên lượt khác. Bạn có thể tạo hai LinearLayouts: một với các chế độ xem nền và một với các chế độ xem nền trước và kết hợp chúng bằng cách sử dụng FrameLayout. Hi vọng điêu nay co ich.


1
Làm thế nào chúng ta có thể đưa nó lên đầu giống như một hộp thoại?
Gaurav Arora

@Infinity, Bạn có thể tạo FragmentDialog cho mục đích này hoặc chỉ sử dụng Theme.Dialog cho Hoạt động của bạn.
Egor

Tôi không thể sử dụng FragmentDialog vì nó không tương thích với API 10. Thứ hai, tôi đã sử dụng một chủ đề cho ứng dụng của mình. Còn cách nào khác không ? Tôi đã sử dụng nó FrameLayout giống như bạn nói!
Gaurav Arora

@Infinity, Bạn có thể sử dụng phiên bản thư viện tương thích của FragmentDialog, có sẵn từ API 4.
Egor

8

Nếu bạn đang sử dụng ConstraintLayout, chỉ cần đặt phần tử sau các phần tử khác để làm cho phần tử phía trước hơn phần tử khác



3

Có thể có một cách khác mà tiết kiệm trong ngày. Chỉ cần khởi tạo Hộp thoại mới với bố cục mong muốn và chỉ hiển thị nó. Tôi cần nó để hiển thị loadView trên DialogFragment và đây là cách duy nhất tôi thành công.

Dialog topDialog = new Dialog(this, android.R.style.Theme_Translucent_NoTitleBar);
topDialog.setContentView(R.layout.dialog_top);
topDialog.show();

bringToFront () có thể không hoạt động trong một số trường hợp như của tôi. Nhưng nội dung của bố trí hộp thoại phải ghi đè bất cứ thứ gì trên lớp ui. Nhưng dù sao, đây là một cách giải quyết xấu xí.


3

tôi đã đối mặt với cùng một vấn đề các giải pháp sau đây đã làm việc cho tôi.

 FrameLayout glFrame=(FrameLayout) findViewById(R.id.animatedView);
        glFrame.addView(yourView);
        glFrame.bringToFront();
        glFrame.invalidate();

Giải pháp thứ 2 là sử dụng xml thêm thuộc tính này vào chế độ xem xml

android:translationZ=""

2

Bạn có thể sử dụng BindingAd CHƯƠNG như thế này:

@BindingAdapter("bringToFront")
public static void bringToFront(View view, Boolean flag) {
    if (flag) {
        view.bringToFront();
    }
}


  <ImageView
        ...
        app:bringToFront="@{true}"/>

0

Bạn cần sử dụng framelayout. Và cách tốt hơn để làm điều này là làm cho chế độ xem vô hình khi không yêu cầu. Ngoài ra, bạn cần đặt vị trí cho mỗi chế độ xem, để chúng sẽ di chuyển theo vị trí tương ứng


0

Nếu bạn đang sử dụng, LinearLayoutbạn nên gọi myView.bringToFront()và sau khi bạn nên gọi parentView.requestLayout()parentView.invalidate()buộc phụ huynh phải vẽ lại theo thứ tự con mới.


0

Cố gắng sử dụng độ cao trên nó, một cái gì đó như yourview.setElevation(5);


0

Nhờ stack sử dụng trên này giải thích, tôi đã có làm việc này ngay cả trên Android 4.1.1

((View)myView.getParent()).requestLayout();
myView.bringToFront();

Về việc sử dụng năng động của tôi, ví dụ, tôi đã làm

public void onMyClick(View v)
     {
     ((View)v.getParent()).requestLayout();
     v.bringToFront();
     }

Và Bamm!


-2

Sắp xếp chúng theo thứ tự bạn muốn hiển thị. Giả sử, bạn muốn hiển thị chế độ xem 1 trên đầu trang 2. Sau đó viết chế độ xem 2 mã sau đó viết chế độ xem 1 mã. Nếu bạn không thể thực hiện thứ tự này, thì hãy gọi bringToFront () đến chế độ xem gốc của bố cục bạn muốn đưa ra phía trước.


-32

Bạn có thể đặt mức độ hiển thị thành sai của các chế độ xem khác.

view1.setVisibility(View.GONE);
view2.setVisibility(View.GONE);
...

hoặc là

view1.setVisibility(View.INVISIBLE);
view2.setVisibility(View.INVISIBLE);
...

và thiết lập

viewN.setVisibility(View.VISIBLE);

4
Tôi cần tất cả để có thể nhìn thấy, đó không phải là vấn đề, vấn đề là thứ tự z. nếu khả năng tồn tại là vấn đề thì nó sẽ dễ giải quyết. . .
Lukap
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.