हर चीज के सामने कैसे लाया जाए?


130

मेरे पास गतिविधि है और इस पर बहुत सारे विगेट्स हैं, उनमें से कुछ में एनिमेशन हैं और एनिमेशन के कारण कुछ विजेट एक दूसरे पर (अनुवाद) चल रहे हैं। उदाहरण के लिए पाठ दृश्य कुछ बटनों पर घूम रहा है। । ।

अब बात यह है कि मैं चाहता हूं कि बटन हमेशा सामने की ओर हों। और जब टेक्स्टव्यू बढ़ रहा है तो मैं बटनों के पीछे जाना चाहता हूं।

मैं इसे हासिल नहीं कर सकता मैंने कोशिश की सब कुछ मुझे पता है, और "bringToFront ()" निश्चितता काम नहीं करती है।

ध्यान दें कि मैं z- क्रम को लेआउट के लिए तत्व रखने के क्रम से नियंत्रित नहीं करना चाहता क्योंकि मैं बस नहीं कर सकता :), लेआउट जटिल है और मैं लेआउट के भीख के सभी बटन नहीं रख सकता


3
मैंने RelativeLayoutXML में दिखाई देने वाले "शीर्ष" दृश्य के साथ उपयोग किया । देखें stackoverflow.com/a/31340762/1121497
फेरन मायलिनच

क्या कोई 'xToFront' के xml में संबंधित कोड बता सकता है
शिरीष हेरवाडे

ऊंचाई से नीचे देखने का प्रयास करें = ऊंचाई: 1dp और topView = उन्नयन: अपने xml में 2dp || ViewCompat.setElevation (देखें, int)
Tlacaelel रेमन लुइस

जवाबों:


144

जिस दृश्य को आप सामने लाना चाहते हैं, उस पर आप callToFront () कॉल कर सकते हैं

यह एक उदाहरण है:

    yourView.bringToFront();

4
अप्रत्याशित परिणाम: मैंने इसका उपयोग एक ऊर्ध्वाधर रैखिक लेआउट में किया और सामने A / B / Cलाया गया दृश्य सबसे नीचे दिखाई दिया ... उदाहरण के लिए, मैं Aसामने लाना चाहता था , इसलिए दौड़ने के बाद a.bringToFront()मैं एक लेआउट की तरह समाप्त हुआ B / C / A
फेरन मेनलिंच

2
इसलिए मैंने पाया LinearLayoutकि इसका इस्तेमाल नहीं किया जा सकता bringToFront। मैं एक का उपयोग कर समाप्त हो गया RelativeLayout। प्रश्न पर मेरी टिप्पणी स्वयं देखें।
फेरन मेलिनच जूल

1
क्या कोई 'xToFront' के xml में संबंधित कोड बता सकता है
शिरीष हेरवाडे

यह उस तत्व की पुन: स्थिति में परिणाम देता है जो मैं किसी भी कारण से सामने ले जा रहा हूं। ViewCompat.setTranslationZ(view, 1)दूसरी ओर पूरी तरह से काम करता है।
बिमदे

1
अगर मैं Android में प्रकट होता है: theme = "@ android: style / Theme.Light.NoTitleBar" गतिविधि में आपके दृश्य की तुलना में ।bringToFront (); पूरी तरह से काम करता है, लेकिन मैंने android: theme = "@ android: style / Theme.AppCompat.Light.NoActionBar" yourView.bringToFront () का उपयोग किया है; काम नहीं करता है। उस एक पर कोई सुराग।
राहुल

42

मैं एक अच्छा जवाब खोजने के लिए स्टैक ओवरफ्लो के माध्यम से देख रहा हूं और जब मुझे नहीं मिला तो मैं डॉक्स के माध्यम से देख रहा था।

लगता है इस सरल उत्तर पर किसी ने ठोकर नहीं खाई है:

ViewCompat.setTranslationZ(view, translationZ);

डिफ़ॉल्ट अनुवाद z 0.0 है


यह px में Z- अक्ष पर तत्व की स्थिति है, जिसे ऊंचाई के रूप में भी जाना जाता है। setTranslationX X- अक्ष (बाएँ / दाएँ) के साथ दृश्य को ले जाएगा, Y- अक्ष (शीर्ष / नीचे) के साथ setTranslationY। Z- अक्ष 3 अक्ष है।
xdevs23

किस बारे में setZ()? यदि मैं सही ढंग से याद करता हूं, तो दृश्य की Z स्थिति इसके उत्थान और इसके अनुवाद Z, सब के बाद है।
गेंसोउकाउ 1337

2
@ Gensoukyou1337, तब ViewCompat.setZ(view, yourValueInPixels); view.setZ()केवल एपीआई 21 और उच्चतर पर काम करता है।
जॉनी फाइव

1
एंड्रॉइड स्टूडियो में जावा 8 कोड की जांच की गई - यह केवल जांचता है कि क्या SDK_INT> = 21 है, इसलिए <21 एपीआई के लिए इसका कोई प्रभाव नहीं है।
वादिम

32

एक और भी सरल समाधान गतिविधि के XML को संपादित करना है। उपयोग

android:translationZ=""

3
यह केवल Android API 21 या इसके बाद के संस्करण में उपयोगी है।
इस्कॉब जूल

25

bringToFront()सही तरीका है, लेकिन, ध्यान दें कि आपको उच्चतम-स्तरीय दृश्य (अपने रूट दृश्य के तहत) पर कॉल bringToFront()और invalidate()विधि करना होगा , उदाहरण के लिए:

आपके विचार का पदानुक्रम है:

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

इसलिए, जब आप अपने बटनों (1-> 6) को वापस चेतन करते हैं, तो आपके बटन नीचे (नीचे) होंगे ImageView। इस पर लाने के लिए (ऊपर) ImageViewआप कॉल करना होगा bringToFront()और invalidate()अपने पर विधि LinearLayoutरों। फिर यह काम करेगा :) ** नोट: android:clipChildren="false"अपने रूट लेआउट या चेतन-व्यू के ग्रेडपेंट_लेआउट के लिए सेट करना याद रखें । आइए मेरे वास्तविक कोड पर एक नज़र डालें:

.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 में

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!


क्या होगा यदि आप केवल छवि 6 के ऊपर बटन 6 लाना चाहते हैं और अन्य बटन नहीं?
एडम काटज़

@AdamKatz: मुझे लगता है कि आपको उन्हें दूसरे स्तर की मुट्ठी में फिर से व्यवस्थित करना होगा। फिर, इसे अपने तरीके से लाएं।
जस्टिन

धन्यवाद मैं एक दृश्य के ऊपर एक पुनर्नवीनीकरण दृश्य का सिर्फ एक आइटम लाने की कोशिश कर रहा हूं, लेकिन इसके नीचे अन्य वस्तुओं को छोड़ दें, बहुत अटक गया!
एडम काटज़

मैंने वही इस्तेमाल किया। एक ही समस्या है कि यह उपकरण पट्टी छुपाता है के साथ अपने काम ठीक है।
user2980181

क्या यह कई स्तरों के साथ काम करता है? मान लीजिए कि मेरे पास एक ConstraintLayoutहै RelativeLayout, और दूसरा है RelativeLayout, दोनों इसकी जड़ ConstraintLayout( match_parent) के समान आकार हैं । पहले के RelativeLayoutपास एक है Button, और दूसरे (जेड-ऑर्डर-वार) के पीछे भी हैRelativeLayout । क्या मैं Buttonपहली बार RelativeLayoutदिखने के लिए ऐसा बना सकता हूँ जैसे कि यह सब कुछ के ऊपर था, जैसे कि यह दिखाई दे रहा है और क्लिक करने योग्य है, उपयोग कर रहा है View::bringToFront()?
ओस्कामे

25

इस कोड के साथ xml में

 android:translationZ="90dp"

3
कहां 90dpसे आया?
सुधीर खानगर

1
यह मैनुअल प्रविष्टि है। आप अपनी आवश्यकता के आधार पर प्रयास कर सकते हैं। 45dp या 135dp या 180dp या 270dp
कृष्णा

आप सिर्फ 1dp का उपयोग नहीं कर सकते हैं?
टायलर टर्नबुल

18

कोशिश करो FrameLayout, यह आपको विचारों को एक दूसरे से ऊपर रखने की संभावना देता है। आप दो बना सकते हैं LinearLayouts: एक पृष्ठभूमि विचारों के साथ, और एक अग्रभूमि विचारों के साथ, और उन्हें जोड़कर उपयोग करें FrameLayout। उम्मीद है की यह मदद करेगा।


1
हम संवाद की तरह इसे शीर्ष पर कैसे ला सकते हैं?
गौरव अरोड़ा

@ इन्फिनिटी, आप इस उद्देश्य के लिए एक FragmentDialog बना सकते हैं, या बस अपनी गतिविधि के लिए Theme.Dialog का उपयोग कर सकते हैं।
ईगोर

मैं FragmentDialog एपीआई 10 के लिए असंगत के बाद से उपयोग नहीं कर सकता। दूसरी बात, मैं पहले से ही अपने आवेदन के लिए एक विषय का उपयोग कर रहा हूँ। क्या कोई और तरीका है ? मैंने इसे फ्रेमलेयूट का उपयोग किया है जैसे आपने कहा था
गौरव अरोड़ा

@ इनफिनिटी में, आप FragmentDialog के संगतता लाइब्रेरी संस्करण का उपयोग कर सकते हैं, जो कि एपीआई 4 से उपलब्ध है
Egor

8

यदि आप उपयोग कर रहे हैं ConstraintLayout, तो अन्य तत्वों के बाद तत्व को दूसरों की तुलना में सामने रखने के लिए रखें



3

एक और तरीका हो सकता है जो दिन बचाता है। बस वांछित लेआउट के साथ एक नया डायलॉग डालें और इसे दिखाएं। मुझे एक DialogFragment पर एक loadingView दिखाने के लिए इसकी आवश्यकता है और यह एकमात्र तरीका था जो मैं सफल रहा।

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

मेरे जैसे कुछ मामलों में काम नहीं कर सकता है। लेकिन Dial_top लेआउट की सामग्री को ui परत पर कुछ भी ओवरराइड करना चाहिए। लेकिन वैसे भी, यह एक बदसूरत वर्कअराउंड है।


3

मैं एक ही समस्या का सामना करना पड़ा है। निम्नलिखित समाधान ने मेरे लिए काम किया है।

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

2 समाधान xml दृश्य एक्सएमएल में इस विशेषता को जोड़ने का उपयोग करके है

android:translationZ=""

2

आप इस तरह से बाइंडिंग एडेप्टर का उपयोग कर सकते हैं:

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


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

0

आपको तामचीनी का उपयोग करने की आवश्यकता है। और ऐसा करने का बेहतर तरीका यह है कि जब thay की आवश्यकता न हो तो दृश्य को अदृश्य बना दिया जाए। इसके अलावा, आपको प्रत्येक दृश्य के लिए स्थिति निर्धारित करने की आवश्यकता है, ताकि वे उसी स्थिति के अनुसार आगे बढ़ें


0

यदि आप उपयोग कर रहे हैं तो आपको LinearLayoutकॉल करना चाहिए myView.bringToFront()और उसके बाद आपको कॉल करना चाहिए parentView.requestLayout()और parentView.invalidate()माता-पिता को नए बच्चे के आदेश के साथ फिर से तैयार करने के लिए मजबूर करना चाहिए ।


0

उस पर ऊंचाई का उपयोग करने की कोशिश करें, जैसे कुछ yourview.setElevation(5);


0

इस स्पष्टीकरण पर उपयोगकर्ता को ढेर करने के लिए धन्यवाद , मुझे यह एंड्रॉइड 4.1.1 पर भी काम कर रहा है

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

मेरे गतिशील उपयोग पर, उदाहरण के लिए, मैंने किया

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

और बम्म!


-2

उन्हें उस क्रम में व्यवस्थित करें जिसे आप दिखाना चाहते हैं। मान लीजिए, आप व्यू 1 के शीर्ष पर दृश्य 1 दिखाना चाहते हैं। फिर दृश्य 2 कोड लिखें और फिर दृश्य 1 कोड लिखें। यदि आप यह आदेश नहीं दे सकते हैं, तो आप जिस लेआउट को सामने लाना चाहते हैं, उसके मूल दृश्य में callToFront () को कॉल करें।


-32

आप दृश्यता को अन्य दृश्यों के झूठ पर सेट कर सकते हैं।

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

या

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

और सेट करें

viewN.setVisibility(View.VISIBLE);

4
मुझे यह चाहिए कि सभी को दिखाई दे, यह समस्या नहीं है, समस्या z- क्रम है। यदि व्यवहार्यता समस्या थी तो इसे हल करना आसान होगा। । ।
लुकप
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.