Her şeyin önüne manzara nasıl getirilir?


131

Aktivitem ve üzerinde çok sayıda widget var, bazılarının animasyonları var ve animasyonlar nedeniyle bazı widget'lar birbiri üzerine hareket ediyor (tercüme ediyor). Örneğin, metin görünümü bazı düğmelerin üzerinde hareket ediyor. . .

Şimdi mesele şu ki, düğmelerin her zaman önde olmasını istiyorum. Ve metin görünümü hareket ederken, düğmelerin arkasına geçmek istiyorum.

Bunu başaramıyorum, bildiğim her şeyi denedim ve "comeToFront ()" kesinlikle çalışmıyor.

note Not Z sırasını yerleşim düzenine yerleştirme sırasına göre kontrol etmek istemiyorum çünkü yapamıyorum :), düzen karmaşık ve tüm düğmeleri düzenin yalvarışına yerleştiremiyorum


3
RelativeLayoutXML'de en son görünen "üst" görünümle bir kullandım . Bkz stackoverflow.com/a/31340762/1121497
Ferran Maylinch

herhangi biri xml'de 'throwToFront'
Shirish Herwade

Xml'nizde bottomView = elevation: 1dp ve topView = elevation: 2dp elevation kullanmayı deneyin || ViewCompat.setElevation (View, int)
Tlacaelel Ramon Luis

Yanıtlar:


144

Ön tarafa geçmek istediğiniz görünümde comeToFront () 'u çağırabilirsiniz

Bu bir örnektir:

    yourView.bringToFront();

4
Beklenmeyen sonuç: Bunu dikey bir doğrusal düzende kullandım ve öne getirilen görünüm altta belirdi ... Örneğin ben vardı A / B / Cve Aöne getirmek istedim , bu yüzden koştuktan sonra a.bringToFront()gibi bir düzen ile sonuçlandım B / C / A.
Ferran Maylinch

2
Bu yüzden LinearLayoutkullanılamaz buldum bringToFront. Bir RelativeLayout. Sorunun kendisi hakkındaki yorumuma bakın.
Ferran Maylinch

1
herhangi biri xml'de 'throwToFront'
Shirish Herwade

Bu, her ne sebeple olursa olsun öne taşıdığım öğenin yeniden konumlandırılmasına neden olur. ViewCompat.setTranslationZ(view, 1)Öte yandan mükemmel çalışıyor.
Bimde

1
eğer manifest android: theme = "@ android: style / Theme.Light.NoTitleBar" etkinliğinde yourView.bringToFront () yerine kullandıysam; mükemmel çalışıyor, ancak android: theme = "@ android: style / Theme.AppCompat.Light.NoActionBar" yourView.bringToFront (); çalışmıyor. Bununla ilgili herhangi bir ipucu.
Rahul

43

İyi bir cevap bulmak için yığın taşmasına bakıyordum ve bir cevap bulamayınca dokümanlara baktım.

Bu basit cevaba henüz kimse rastlamamış görünüyor:

ViewCompat.setTranslationZ(view, translationZ);

varsayılan çeviri z 0.0'dır


Bu, aynı zamanda yükseklik olarak da bilinen, öğenin Z eksenindeki piksel cinsinden konumudur. setTranslationX, görünümü X ekseni boyunca (sol / sağ) hareket ettirir, Y ekseni boyunca (üst / alt )TranslationY'yi ayarlayın. Z ekseni 3. eksendir.
xdevs23

Peki ya setZ()? Doğru hatırlıyorsam, görünümün Z konumu, sonuçta, görünüşün yüksekliği artı Z'nin ötelenmesidir.
Gensoukyou1337

2
@ Gensoukyou1337, daha sonra ViewCompat.setZ(view, yourValueInPixels); view.setZ()yalnızca API 21 ve üzerinde çalışır.
Johnny Five

1
Android Studio'da Java 8 kodu kontrol edildi - yalnızca SDK_INT> = 21 olup olmadığını kontrol eder, bu nedenle <21 api için hiçbir etkisi yoktur.
Vadim

32

Daha da basit bir çözüm, aktivitenin XML'sini düzenlemektir. kullanım

android:translationZ=""

3
Bu yalnızca Android API 21 veya sonraki sürümlerde kullanışlıdır.
isakbob

25

bringToFront()doğru yoldur, ancak, en üst düzey görünümde (kök görünümünüz altında) çağırmanız bringToFront()ve invalidate()yöntem yapmanız gerektiğine dikkat edin, örneğin:

Görünümünüzün hiyerarşisi:

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

Dolayısıyla, düğmelerinizi (1-> 6) geri canlandırdığınızda, düğmeleriniz ImageView. Getirmek için (yukarıda) ImageViewsizin e-postalarınızı çağırmalı bringToFront()ve invalidate()yöntem yapmalısınız LinearLayout. Sonra çalışacaktır :) ** NOT: android:clipChildren="false"Kök düzeninizi veya animasyon görünümünün gradparent_layout'unu ayarlamayı unutmayın. Gerçek koduma bir bakalım:

.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>

.Java'da bazı kodlar

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!


Ya düğme 6'yı diğer düğmelerin değil, yalnızca görüntü görünümünün üzerine getirmek isterseniz?
Adam Katz

@AdamKatz: Bence onları başka bir seviye yumruk olarak yeniden düzenlemelisin. Ardından, kendi yolunuza getirin.
Justin

teşekkürler Geri dönüştürücünün sadece bir parçasını manzaranın üzerine getirmeye çalışıyorum, ancak diğer öğeleri de onun altında bırakmaya çalışıyorum, oldukça sıkıştı!
Adam Katz

Ben de aynısını kullandım. Araç çubuğunu gizlediği tek bir problemle sorunsuz çalışıyor.
user2980181

Bu birden çok seviyede mi çalışıyor? Diyelim ConstraintLayoutki a'yı içeren bir a'ya sahibim RelativeLayoutve başka bir tane var RelativeLayout, her ikisi de kökü ConstraintLayout( match_parent) ile aynı boyutta . İlki a'ya RelativeLayoutsahiptir Buttonve ayrıca ikincinin (z-sırası) gerisindedir RelativeLayout. Ben yapabilir miyim Buttonilk RelativeLayouto kullanıyor, görünür ve tıklanabilir olduğunu, öyle ki, her şeyin üstünde sanki görünmesini View::bringToFront()?
oaskamay


18

Deneyin FrameLayout, size görüşleri üst üste koyma imkanı verir. İki LinearLayoutstane oluşturabilirsiniz : biri arka plan görünümleriyle ve diğeri ön plan görünümleriyle ve FrameLayout. Bu yardımcı olur umarım.


1
Bunu bir diyalog gibi nasıl zirveye çıkarabiliriz?
Gaurav Arora

@Infinity, Bu amaçla bir FragmentDialog oluşturabilir veya Aktiviteniz için sadece Theme.Dialog'u kullanabilirsiniz.
Egor

API 10 ile uyumsuz olduğu için FragmentDialog'u kullanamıyorum. İkinci olarak, zaten uygulamam için bir tema kullanıyorum. Başka bir yolu var mı? Dediğin gibi FrameLayout'u kullandım!
Gaurav Arora

@Infinity, API 4'te bulunan FragmentDialog uyumluluk kitaplığı sürümünü kullanabilirsiniz.
Egor

8

Eğer kullanıyorsanız ConstraintLayout, diğerlerinden daha öne çıkarmak için diğer elemanların arkasına yerleştirin.



3

Günü kurtarmanın başka bir yolu olabilir. Sadece istenen düzene sahip yeni bir Diyalog başlatın ve gösterin. Bir DialogFragment üzerinden loadingView göstermek için buna ihtiyacım var ve bu başarılı olmamın tek yoluydu.

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

comeToFront () benimki gibi bazı durumlarda çalışmayabilir. Ancak dialog_top düzeninin içeriği ui katmanındaki her şeyi geçersiz kılmalıdır. Ama her neyse, bu çirkin bir çözüm.


3

ben de aynı problemle karşılaştım. aşağıdaki çözüm benim için çalıştı.

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

2. çözüm, xml kullanarak bu özniteliği xml görünümüne eklemektir.

android:translationZ=""

2

BindingAdapter'ı şu şekilde kullanabilirsiniz:

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


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

0

Framelayout kullanmanız gerekir. Ve bunu yapmanın daha iyi yolu, gerekli olmadığında görünümü görünmez yapmaktır. Ayrıca, her bir görünüm için konumu ayarlamanız gerekir, böylece ilgili konuma göre hareket edeceklerdir.


0

Eğer bir kullanıyorsanız LinearLayoutaramak gerekir myView.bringToFront()ve sonra çağırmalıdır parentView.requestLayout()ve parentView.invalidate()yeni alt emriyle yeniden çizmek için üst zorlamak için.


0

Üzerinde yükseklik kullanmayı deneyin. yourview.setElevation(5);


0

Stack kullanıcısı sayesinde bu açıklama üzerinden , bunu Android 4.1.1'de bile çalıştırıyorum

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

Örneğin dinamik kullanımımda yaptım

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

Ve Bamm!


-2

Göstermek istediğiniz sıraya göre düzenleyin. Diyelim ki görünüm 1'i görünüm 2'nin üstünde göstermek istiyorsunuz. Sonra görünüm 2 kodunu ve ardından görünüm 1 kodunu yazın. Bu sıralamayı yapamazsanız, öne getirmek istediğiniz düzenin kök görünümüne götürmekToFront () öğesini çağırın.


-32

Diğer görünümlerin görünürlüğünü false olarak ayarlayabilirsiniz.

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

veya

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

ve ayarla

viewN.setVisibility(View.VISIBLE);

4
Hepsinin görünür olmasına ihtiyacım var, sorun bu değil, sorun z-düzenidir. Sorun yaşayabilirlik olsaydı, çözmesi kolay olurdu. . .
Lukap
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.