Android में RelativeLayout के विचारों के Z क्रम को परिभाषित करना


226

मैं Android में एक RelativeLayout के विचारों के z क्रम को परिभाषित करना चाहूंगा।

मुझे पता है कि ऐसा करने का एक तरीका कॉलिंग है bringToFront

क्या ऐसा करने के बेहतर तरीके हैं? यह बहुत अच्छा होगा यदि मैं z ऑर्डर को लेआउट xml में परिभाषित कर सकता हूं।


4
View.bringToFront (); anser है
शिरीष Herwade

जवाबों:


314

सबसे आसान तरीका बस उस क्रम पर ध्यान देना है जिसमें आपकी एक्सएमएल फ़ाइल में दृश्य जोड़े जाते हैं। फ़ाइल में नीचे का अर्थ है Z- अक्ष में ऊपर।

संपादित करें: यह Android डेवलपर साइट पर यहां और यहां प्रलेखित है । (साभार @flightplanner)


16
यह दुर्भाग्य से हमेशा बदलने के लिए संभव नहीं है। उदाहरण के लिए, एक रिश्तेदार लेआउट में, प्रत्येक तत्व केवल फ़ाइल में पहले से परिभाषित लोगों के संबंध में
रखे जा सकते हैं

67
Casebash, मुझे नहीं लगता है कि केवल इस मामले में आपको "@ + आईडी / your_element_before_its_defined" का उपयोग करना होगा और फिर उसी तत्व का उपयोग करें जिसे आप बाद में परिभाषित करते हैं। मैं इसके बारे में गलत हो सकता हूं, ये लेआउट मेरे लिए बहुत मुश्किल हैं, लेकिन मुझे निश्चित रूप से यह धारणा मिलती है कि यह काम करता है।
tjb

7
tjb सही है (और मुझे खुशी है कि वह है)। आईडी के पहले उल्लेख के साथ @ + आईडी का उपयोग करें जैसे कि layout_above = "@ + id / some_id"
Michiel

3
आप एक मान xml फ़ाइल में <आइटम प्रकार = "आईडी" नाम = "<your_id>" /> भी डाल सकते हैं, और फिर आप इसे कहीं भी संदर्भित कर सकते हैं।
कर्ल

8
मुझे पता है कि मुझे पार्टी में लगभग 3 साल देर हो चुकी है, लेकिन @ फिक के जवाब में, यह यहाँ
HexAndBugs

88

यदि आप कोड में यह करना चाहते हैं तो आप कर सकते हैं

View.bringToFront();

डॉक्स देखें


68

कृपया ध्यान दें, एपीआई 21 में बटन और अन्य तत्वों और अधिक से अधिक एक उच्च ऊंचाई है, और इसलिए मूल लेआउट की परवाह किए बिना तत्वों के xml क्रम को अनदेखा करें। मुझे यह जानने में थोड़ी देर लगी कि एक बाहर।


16
मेरे लिए इस बग का समाधान सेटलेवेशन (1000) को देखने के लिए था, जिसे मैं बटन पर प्रदान करना चाहता हूं।
को छेद में आग

setElevation () के लिए एपीआई स्तर 21
dp2050

21

एपीआई स्तर 21 से शुरू होने वाले एंड्रॉइड में, लेआउट फ़ाइल में आइटम दोनों को जेड ऑर्डर मिलता है, जिससे उन्हें फ़ाइल के भीतर ऑर्डर दिया जाता है, जैसा कि सही उत्तर में वर्णित है, और उनके उत्थान से, एक उच्च ऊंचाई मूल्य का मतलब है कि आइटम को एक उच्च जेड ऑर्डर मिलता है। ।

यह कभी-कभी समस्याओं का कारण बन सकता है, खासकर उन बटनों के साथ जो अक्सर आइटम के शीर्ष पर दिखाई देते हैं जो कि XML के आदेश के अनुसार जेड क्रम में उनके नीचे होना चाहिए। इसे ठीक करने android:elevationके लिए अपने लेआउट एक्सएमएल में उन वस्तुओं को सेट करें जिन्हें आप जिस Z ऑर्डर को प्राप्त करना चाहते हैं, उससे मिलान करें।

मैंने आपको लेआउट में एक तत्व की एक ऊंचाई निर्धारित की है यह एक छाया डालना शुरू कर देगा। यदि आप इस प्रभाव को नहीं चाहते हैं तो आप छाया को कोड की तरह हटा सकते हैं:

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

मुझे लेआउट xml के माध्यम से एक ऊंचे दृश्य की छाया को हटाने का कोई तरीका नहीं मिला है।


1
जैसा कि टिप्पणियों में बताया गया है, आप उपयोग कर सकते हैं android:elevation="1000dp"। इस तरह कोई छाया प्रदान नहीं की जाती है।
वादिम कोटोव

15

मुझे समान मुद्दों का सामना करना पड़ा: एक रिश्तेदार लेआउट पेरेंटव्यू में, मेरे 2 बच्चे चाइल्ड व्यू 1 और चाइल्ड व्यू 2 हैं। सबसे पहले, मैंने चाइल्ड व्यू 1 को चाइल्ड व्यू 2 से ऊपर रखा और मैं चाहता हूं कि चाइल्ड व्यू 1 चाइल्ड व्यू 2 के शीर्ष पर हो। बच्चों के विचारों के क्रम को बदलने से मेरे लिए समस्या का समाधान नहीं हुआ। मेरे लिए काम करने के लिए एंड्रॉइड सेट करना है : clipChildren = parentView पर "झूठा" और मेरे द्वारा सेट किए गए कोड में:

childView1.bringToFront();

parentView.invalidate();

2
यह काम कर रहा है, और Android मुझे बहुत दुखी करता है। child.bringToFront()साथ parent.invalidate()काम करता है, लेकिन parent.bringChildToFront(child)ऐसा नहीं करता। यह तर्क कहां है कि हम सभी एक ओएस से उम्मीद करते हैं?
ओलिवर हॉसलर

कुछ विचारों (एक्स और वाई में अनुवाद) को चेतन करने के लिए, मैंने लिनियरलैट, फ्रेमलेयआउट और रिलेटिवलैट के लिए कई संयोजनों की कोशिश की, लेकिन हमेशा मुद्दे थे (ओवरलैप या आनुपातिक आकार से संबंधित नहीं)। अंत android:clipChildren="false"में चाल चली। धन्यवाद!
JCarlosR

15

कृपया ध्यान दें कि आप view.setZ(float)एपीआई स्तर 21 से शुरू कर सकते हैं । यहां आप अधिक जानकारी पा सकते हैं।


13

सोचा था कि मैं एक जवाब जोड़ दूंगा

एंड्रॉयड: translationZ

XML क्षेत्र ने चीजों को एक बालक में बदल दिया। अन्य उत्तर जो चलाने का सुझाव देते हैं

childView1.bringToFront();

parentView.invalidate();

इस कोड के लिए EXCEPT पर पूरी तरह से हाजिर हैं कि यह कोड किसी भी दृश्य के सामने चाइल्ड व्यू 1 को हार्डकोडेड एंड्रॉइड: ट्रांसलेशन के साथ एक्सएमएल फाइल में नहीं लाएगा। मुझे इससे समस्या हो रही थी, और एक बार जब मैंने इस क्षेत्र को अन्य विचारों से हटा दिया, तो लाया (सबसे अच्छा) काम किया।


यह एंड्रॉइड 5 के लिए भी सच हैelevation
शेल

5

एपीआई 21 में view.setElevation(float)बिल्ड-इन है

ViewCompat.setElevation(view, float);पिछड़ी अनुकूलता के लिए उपयोग करें

अधिक विधियाँ ViewCompat.setZ(v, pixels)औरViewCompat.setTranslationZ(v, pixels)

एक और तरीका बटन या व्यू ऐरे इकट्ठा करता है और addViewRelativeLayout में जोड़ने के लिए उपयोग करता है


4

childView.bringToFront () मेरे लिए काम नहीं करता था, इसलिए मैंने कम से कम हाल ही में जोड़े गए आइटम का Z अनुवाद सेट किया (वह जो अन्य सभी बच्चों को ओवरलेइंग किया गया था) जैसे कि एक नकारात्मक मूल्य:

lastView.setTranslationZ(-10);

देख https://developer.android.com/reference/android/view/View.html#setTranslationZ(float) और अधिक के लिए


1

आप RelativeLayoutरिडिफाइन्ड के साथ कस्टम का उपयोग कर सकते हैं

protected int getChildDrawingOrder (int childCount, int i)

जागरूक रहें - यह तरीका परम iको "जो मुझे आकर्षित करना चाहिए" के रूप में लेता है i'th। इस तरह ViewPagerकाम करता है। इसके साथ संयोजन में कस्टम ड्राइंग ऑर्डर सेट करता है PageTransformer


0

जांचें कि क्या आपके पास XML में किसी एक दृश्य पर कोई ऊंचाई है। यदि हां, तो मुद्दे को हल करने के लिए दूसरे आइटम में उन्नयन जोड़ें या ऊँचाई को हटा दें। वहां से, यह उन विचारों का क्रम है जो दूसरे के ऊपर आने वाले को निर्धारित करता है।


0

या फ्रेमलेयआउट के अंदर ओवरलैपिंग बटन या विचार रखें। फिर, xml फ़ाइल में RelativeLayout बच्चे के लेआउट के आदेश का सम्मान करेगा जैसा उन्होंने जोड़ा।


0

आप समान प्राप्त करने के लिए नीचे दिए गए कोड नमूने का भी उपयोग कर सकते हैं

ViewCompat.setElevation(sourceView, ViewCompat.getElevation(mCardView)+1);

यह पिछड़ा संगत है। यहाँ mCardViewएक दृश्य है जो नीचे होना चाहिए sourceView

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