एंड्रॉइड में दूसरे दृश्य के ऊपर एक दृश्य को प्लेस / ओवरलैपिंग (जेड-इंडेक्स)


230

मेरे पास एक रेखीय लेआउट है जिसमें चित्र और टेक्स्टव्यू शामिल हैं, एक रैखिक लेआउट में एक और नीचे।

<LinearLayout android:orientation="horizontal" ... >
 <ImageView 
     android:id="@+id/thumbnail"
     android:layout_weight="0.8" 
     android:layout_width="0dip"
     android:layout_height="fill_parent">
 </ImageView>
 <TextView 
    android:id="@+id/description"
    android:layout_weight="0.2"
    android:layout_width="0dip"
    android:layout_height="wrap_content">
 </TextView>

कुछ नियम गायब हो सकते हैं, यह एक विचार देना है, लेआउट कैसा दिखता है। मैं चाहता हूं कि लंबाई और चौड़ाई में 50dip का एक और छोटा पाठ दृश्य, छवि से अधिक "चौड़ाई" पर रखा जाए, "ओवर" से मेरा मतलब छविचित्र से अधिक जेड-इंडेक्स है, मैं इसे केंद्र में और ऊपर (ओवरलैपिंग) इमेजव्यू में रखना चाहता हूं।

मैं जानना चाहता हूं कि हम अलग-अलग z- इंडेक्स (अधिमानतः रैखिक लेआउट) के साथ एक दृश्य को दूसरे के ऊपर कैसे रख सकते हैं?

जवाबों:


295

आप इसके लिए एक LinearLayout का उपयोग नहीं कर सकते हैं, लेकिन आप एक का उपयोग कर सकते हैं FrameLayout। एक में FrameLayout, z- इंडेक्स को उस क्रम से परिभाषित किया जाता है जिसमें आइटम जोड़े जाते हैं, उदाहरण के लिए:

<FrameLayout
    xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    >
    <ImageView
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:src="@drawable/my_drawable"
        android:scaleType="fitCenter"
        />
    <TextView
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_gravity="bottom|center"
        android:padding="5dp"
        android:text="My Label"
        />
</FrameLayout>

इस उदाहरण में, छवि के निचले केंद्र के साथ, ImageView के शीर्ष पर TextView तैयार किया जाएगा।


हाँ, मैंने इसे प्रलेखन के माध्यम से जाने के बाद फ्रेम लेआउट का उपयोग किया। धन्यवाद।
बैठे

11
क्या इसके लिए RelativeLayout के बजाय FrameLayout का उपयोग करने का कोई फायदा है?
Ixx

12
फ़्रेमलैटआउट समूह में अन्य विचारों से संबंधित नहीं है, यह सिर्फ माता-पिता के संबंध में उन्हें परत करता है। RelativeLayout अन्य वस्तुओं के सापेक्ष स्थिति के लिए अधिक है।
केविन कोप्पॉक

3
हाय kcoppock मेरा मोबाइल (एचडीपीआई) फ्रेम लेआउट में जेड-ऑर्डर का सम्मान नहीं करता है, लेकिन मेरे पास एक अन्य (xhdpi) है और इस आदेश का सम्मान करता है, क्या आप जानते हैं कि यह क्यों होता है? अग्रिम में धन्यवाद! : डी
मर्ली एस्केरपेंटर पेरेस

1
एपीआई 21 / किटकैट के रूप में आप अब सेटज और ट्रांसलेशन का उपयोग कर सकते हैं; FrameLayout हैक की अब आवश्यकता नहीं है (अंत में!)। यह आधुनिक 5.0+ विकास के लिए पसंदीदा उत्तर होना चाहिए: stackoverflow.com/a/29703860/358578
pbarranis

183

इसके लिए प्रयास करें .bringToFront():

http://developer.android.com/reference/android/view/View.html#bringToFront%28%29


3
क्या हम इसका उपयोग xml फ़ाइलों में भी कर सकते हैं?
विज्ञापन

2
मैं अनुवाद एनीमेशन के दौरान itz zindex को बदलने के लिए अपने विचार को लाने के लिए कुछ ऐसा ढूंढ रहा था।
DeltaCap019

क्या आप अनुवाद एनीमेशन के लिए एक समाधान पा सकते हैं?
nAkhmedov

9
bringChildToFront () सिर्फ अपने माता
Zar E Ahmer

4
यह पूरे लेआउट ऑर्डर को
खराब कर देता है

66

RelativeLayout उसी तरह से काम करता है, रिश्तेदार लेआउट में अंतिम छवि जीतती है।


14
जब तक आप उत्थान का उपयोग नहीं करते हैं, तब आपको उसमें सबसे बड़ा मूल्य भी चाहिए।
सामी कुहोमेन

5
यह सवाल ऊंचाई पर मौजूद होने से पहले पूछा गया और जवाब दिया गया। यदि आपका ऐप लॉलीपॉप से ​​कम है (पूर्व-लॉलीपॉप फोन पर लेआउट गलत दिखाई देगा यदि आप केवल ऊँचाई पर भरोसा करते हैं) - तो उन्नयन का उपयोग समस्या को ठीक नहीं करेगा - आपको अभी भी लेआउट के आदेश पर ध्यान देना होगा। आप हालांकि सही हैं, कि अगर आप नीचे के घटक पर ऊंचाई का उपयोग करते हैं - तो आपको निश्चित रूप से शीर्ष पर कम से कम समान या उच्चतर होना चाहिए।
jt-gilkeson

27

ड्रॉ ऑर्डर बदलना

एक विकल्प उस क्रम को बदलना है जिसमें माता-पिता द्वारा विचार तैयार किए जाते हैं। आप SetChildrenDrawingOrderEnabled (ट्रू) को कॉल करके और GetChildDrawingOrder (int चाइल्डकैाउंट, int i) को ओवरराइड करके ViewGroup से इस सुविधा को सक्षम कर सकते हैं ।

उदाहरण:

/**
 * Example Layout that changes draw order of a FrameLayout
 */
public class OrderLayout extends FrameLayout {

    private static final int[][] DRAW_ORDERS = new int[][]{
            {0, 1, 2},
            {2, 1, 0},
            {1, 2, 0}
    };

    private int currentOrder;

    public OrderLayout(Context context) {
        super(context);
        setChildrenDrawingOrderEnabled(true);
    }

    public void setDrawOrder(int order) {
        currentOrder = order;
        invalidate();
    }

    @Override
    protected int getChildDrawingOrder(int childCount, int i) {
        return DRAW_ORDERS[currentOrder][i];
    }
}

आउटपुट:

OrderLayout#setDrawOrder(int)0-1-2 परिणामों के साथ कॉलिंग :

यहां छवि विवरण दर्ज करें यहां छवि विवरण दर्ज करें यहां छवि विवरण दर्ज करें


क्या आप setDrawOrder (i) को गतिविधि के ऑनक्रिएट () में कहते हैं? यदि मेरे xml में 6 विगेट्स हैं, तो क्या मुझे 6 नंबरों (0-5) की एक सरणी के साथ DRAW_ORDERS की प्रत्येक पंक्ति को इनिशियलाइज़ करने की आवश्यकता है?
जॉन वार्ड

@ जॉन लेआउट ऊपर दिखाया गया उदाहरण उदाहरण के लिए है, आप getChildDrawingOrder () में अपने स्वयं के व्यवहार को परिभाषित कर सकते हैं।
टोब्रुन

यहाँ बहुत स्पष्ट कोड के साथ संबंधित पोस्ट: stackoverflow.com/questions/20524162/framelayout-in-reverse
रॉबर्ट

20

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


3
यह अब एपीआई 21 / किटकैट / 5.0 या उच्चतर के लिए पसंदीदा उत्तर होना चाहिए। पुराने फ्रेमलैट हैक का शुक्र है कि अब इसकी आवश्यकता नहीं है। व्यक्तिगत रूप से मैं सेटज़ और ट्रांसलेशनज़ के बीच के अंतर को नहीं समझता, लेकिन उत्तरार्द्ध एक विशेषता है और मेरे लिए खूबसूरती से काम किया है। धन्यवाद!
पबरानिस

पिछले एपिस के लिए आप ViewCompat # setZ () का भी उपयोग कर सकते हैं।
अली युकेल अक्गुल

@AliYucelAkgul यदि आप यहां डॉक्स देखते हैं , तो आप देख सकते हैं Compatibility: API < 21: No-op । तो मुझे लगता है कि यह काम नहीं करेगा
वादिम कोटोव

@VadimKotov, मैंने अपने ऐप में कोशिश की है और यह सिर्फ काम करता है।
अली युकेल अक्गुल

@AliYucelAkgul अच्छी तरह से, यह अजीब है। हो सकता है डॉक्स में कोई गलती हो? क्या आप 100% सुनिश्चित हैं कि यह एपीआई <21 के लिए काम कर रहा है? मुझे लगता है कि यह पिछले एपीआई के लिए विचारों का क्रम बदल सकता है, लेकिन कोई फैंसी सामान जैसे ऊंचाई, आदि ..
वादिम कोटोव

14

मैंने एक ही समस्या को जोड़कर हल किया कि android:elevation="1dp"आप किस दृश्य को दूसरे पर चाहते हैं। लेकिन यह 5.0 से नीचे प्रदर्शित नहीं कर सकता है, और इसमें थोड़ी छाया होगी, यदि आप इसे स्वीकार कर सकते हैं, तो यह ठीक है।

तो, सबसे सही समाधान जो @kcoppock ने कहा है।


7

RelativeLayout में यह प्रयास करें:

ImageView image = new ImageView(this);
image.SetZ(float z);

इससे मेरा काम बनता है।


2
आपको थोड़ा बेहतर तरीके से समझाना चाहिए। उदाहरण के लिए आप इस कोड को कहां रखेंगे?
देवबफ 2

खैर, मैंने इसे ऑनक्रिएट () विधि में डाल दिया। जोड़े गए प्रत्येक चित्र में पहले जोड़े गए लोगों पर वरीयता का एक z सूचकांक है। मेरा मतलब है, z इंडेक्स के माध्यम से मैं पिछले के पीछे की स्थिति को बदल सकता हूं।
रिज़ो २

5

LinearLayout का उपयोग करने का एक तरीका है। बस अपने पिछले तत्व के मार्जिन को संबंधित नकारात्मक मान पर सेट करें, और सुनिश्चित करें कि आप जिस तत्व को शीर्ष पर चाहते हैं वह आपके XML में नीचे दिए गए तत्व के बाद है।

<linearLayout android:orientation="horizontal" ... >
<ImageView 
 android:id="@+id/thumbnail"
 android:layout_weight="0.8" 
 android:layout_width="0dip"
 android:layout_height="fill_parent"
>
</ImageView>
<TextView 
android:id="@+id/description"
android:layout_marginTop="-20dip"
android:layout_weight="0.2"
android:layout_width="0dip"
android:layout_height="wrap_content"
>
</TextView>

4

AFAIK आप इसे रैखिक लेआउट के साथ नहीं कर सकते, आपको एक RelativeLayout के लिए जाना होगा ।


RelativeLayout फ्रेमलैट का विस्तार नहीं करता है, क्या आप सुनिश्चित हैं कि यह काम करेगा?
ekatz

यह। आप फ़्रेमलैटआउट या रिलेटिवलाईट में से किसी का भी उपयोग कर सकते हैं। प्रत्येक बच्चे के विचारों को रखने के विभिन्न तरीके हैं। उन लेआउट के बारे में अधिक जानने के लिए डॉक्स का संदर्भ लें।
विन्सेन्ट मिमौन-प्रात

यह जाने का रास्ता है
अल्बर्ट जेम्स टेडी


0

मैं इसका उपयोग करता हूं, यदि आप चाहते हैं कि जरूरत पड़ने पर केवल एक दृश्य सामने लाया जाए:

containerView.bringChildToFront(topView);

containerView विचारों क्रमबद्ध करना के कंटेनर है, Topview दृश्य जो मैं शीर्ष के रूप में कंटेनर में सबसे अधिक करना चाहते है।

व्यवस्था करने के लिए कई विचारों के बारे में ऊपर बताए अनुसार सेटचिल्ड्रेन्रॉड्रिंगऑर्डर (सत्य) और ओवरराइडिंग गेटचिल्ड्रिंगऑर्डर (इंट चाइल्डकाउंट, इंट आई) का उपयोग करने वाला है।

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