नेस्टेड वेट प्रदर्शन के लिए खराब क्यों हैं? वैकल्पिक?


160

मैंने एक युगल लेआउट फाइलें लिखी हैं, जहां मैंने layout_weightविभिन्न विचारों के बीच अनुपात बनाने के लिए विशेषता का उपयोग किया है।

कुछ बिंदु पर, मुझे नेस्टेड वेट के बारे में एक प्रकार का चेतावनी मिलना शुरू हो जाता है।

इसलिए, मुझे आश्चर्य है कि प्रदर्शन के लिए नेस्टेड वेट क्यों खराब हैं, और यदि दृश्य आयामों के बीच एक निरंतर अनुपात बनाने के लिए एक अधिक कुशल तरीका है जो विभिन्न स्क्रीन आकारों के लिए उपयोग किया जा सकता है और इसके लिए बहुत अधिक आयाम डीपीआई मान निर्दिष्ट करने की आवश्यकता नहीं है कई लेआउट फ़ाइलों के माध्यम से (विभिन्न स्क्रीन आकारों के लिए, मेरा मतलब है)।

धन्यवाद!


2
लेआउट ऑप्टिमाइज़ेशन डेवलपर के
मुहम्मद बाबर

जवाबों:


140

नेस्टेड वेट प्रदर्शन के लिए खराब हैं क्योंकि:

लेआउट वेट को दो बार मापने के लिए एक विजेट की आवश्यकता होती है। जब नॉन-जीरो वेट के साथ एक लिनियर लयआउट को नॉन-जीरो वेट के साथ दूसरे लीनियरलैट के अंदर नस्ट किया जाता है, तो माप की संख्या तेजी से बढ़ जाती है।

RelativeLayout s का उपयोग करना बेहतर है और विशिष्ट dpi मानों का उपयोग किए बिना अन्य दृश्यों के स्थानों के अनुसार अपना दृष्टिकोण समायोजित करें।


87
अच्छी बात है, जो मुझे पता है कि संदेश का उद्देश्य है। मैं यह नोट करूंगा कि यदि घातांक छोटा है, तो एक घातीय प्रभाव अभी भी छोटा है। घोंसले के शिकार की छोटी गहराई के लिए, ऐसा करने के लिए आवश्यक सीपीयू का उपयोग नहीं करने के लिए एक वर्कहॉर्स की तरह है जो आप पूरे हफ्ते लाड़ करते हैं और केवल रविवार को सैर के लिए निकलते हैं। फिर भी, घोंसले के शिकार की बड़ी गहराई के लिए, यह अच्छी तरह से लिया गया एक बिंदु है।
कार्ल

14
RelativeLayout को अपने सभी बच्चों के लेआउट को ठीक से सुनिश्चित करने के लिए दो बार माप की आवश्यकता होती है, इसलिए LinearLayout को लेआउट के वजन के साथ RelativeLayout में बदलें प्रदर्शन में सुधार नहीं हो सकता है।
प्यासी

सापेक्ष लेआउट हमेशा काम नहीं करता है। ऐसे मामलों में जहां आपको आनुपातिक विजेट बनाने की आवश्यकता होती है
अब्दुरखमोन

67

अद्यतन: जैसा कि हम जानते हैं कि प्रतिशत समर्थन पुस्तकालय एपीआई स्तर 26 से पदावनत है। ConstraintLayoutसमान फ्लैट xml संरचना को प्राप्त करने का नया तरीका है।

अपडेटेड गितुब परियोजना

अपडेट किए गए नमूने:

<android.support.constraint.ConstraintLayout 
    xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    android:layout_width="match_parent"
    android:layout_height="match_parent">

    <TextView
        android:id="@+id/fifty_thirty"
        android:layout_width="0dp"
        android:layout_height="0dp"
        android:background="#ffff8800"
        android:gravity="center"
        android:text="@string/fifty_fifty_text"
        android:textColor="@android:color/white"
        app:layout_constraintHeight_default="percent"
        app:layout_constraintHeight_percent="0.5"
        android:textSize="25sp"
        app:layout_constraintTop_toTopOf="parent"
        app:layout_constraintWidth_default="percent"
        app:layout_constraintWidth_percent="0.5" />

    <TextView
        android:layout_width="0dp"
        android:layout_height="0dp"
        android:background="#ffff5566"
        android:gravity="center"
        android:text="@string/fifty_fifty_text"
        android:textColor="@android:color/white"
        android:textSize="25sp"
        app:layout_constraintHeight_default="percent"
        app:layout_constraintHeight_percent="0.5"
        app:layout_constraintLeft_toRightOf="@id/fifty_thirty"
        app:layout_constraintTop_toBottomOf="@id/fifty_thirty"
        app:layout_constraintWidth_default="percent"
        app:layout_constraintWidth_percent="0.5" />

</android.support.constraint.ConstraintLayout>

अद्यतन: महान समाचार android प्रतिशत समर्थन पुस्तकालय प्रदर्शन की हमारी समस्या को हल करता है और गन्दा भारित होता हैLinearLayout

compile 'com.android.support:percent:23.0.0'

यहां डेमो करें

इसे प्रदर्शित करने के लिए इस सरल लेआउट पर विचार करें।

प्रतिशत समर्थन लाइब्रे डेमो

<android.support.percent.PercentRelativeLayout
    xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    android:layout_width="match_parent"
    android:layout_height="match_parent">
    <TextView
        android:id="@+id/fifty_huntv"
        android:layout_width="0dp"
        android:layout_height="0dp"
        android:background="#ff7acfff"
        android:text="20% - 50%"
        android:textColor="@android:color/white"
        app:layout_heightPercent="20%"
        app:layout_widthPercent="50%" />
    <TextView
        android:layout_width="0dp"
        android:layout_height="0dp"
        android:layout_toRightOf="@id/fifty_huntv"
        android:background="#ffff5566"
        android:text="80%-50%"
        app:layout_heightPercent="80%"
        app:layout_widthPercent="50%"
        />

</android.support.percent.PercentRelativeLayout>

टाला हुआ प्रदर्शन अपमानित LinearLayoutवजन के साथ नेस्टेड । बहुत भयानक !!!।


@dan हाँ विचार करते हुए हमने वज़न के साथ रेखीय लेआउट को नेस्ट किया है।
नितेश

3
"इस वर्ग को एपीआई स्तर 26.0.0-beta1 में पदावनत किया गया था। इसके बजाय कांस्ट्रेनल लयआउट और संबद्ध लेआउट का उपयोग करने पर विचार करें।" डेवलपर
.android.com

7
मुझे कॉन्स्टेंट लाईआउट पसंद नहीं है। यह मेरे लिए सहज व्यवहार नहीं करता
कार्सन होल्जाइमर


1
शायद ऑटोलैयट बाधाओं पर सेब द्वारा दिए गए स्पष्टीकरण स्पष्ट हैं, और जैसा कि तर्क समान है, यह मदद कर सकता है। दुर्भाग्य से मुझे Droid के ConstraintLayout को iOS '
AutoLayout

46

मुझे लगता है कि (और मैं शायद इसके लिए भड़का जाऊंगा), लेकिन फिर से मुझे लगता है कि मेरे फोन में प्रतिद्वंद्वी लोगों के लिए एक क्वाड कोर प्रोसेसर है (यदि पूरी तरह से नष्ट नहीं हुआ है) तो अधिकांश लोग घर पीसी के हैं।

मुझे यह भी लगता है कि इस तरह की हार्डवेयर क्षमता फोन का भविष्य है।

तो मैं एक निष्कर्ष पर आता हूं, कि जब तक आप घोंसले के शिकार से दूर नहीं हो रहे हैं (एमएचओ में एक लेआउट कभी भी अधिक नहीं होना चाहिए, तो 4 का स्तर गहरा हो सकता है, और अगर यह है कि आप शायद इसे गलत कर रहे हैं), तो आपका फोन कम देखभाल कर सकता है वजन होने के बारे में।

ऐसी कई चीजें हैं जो आप कर सकते हैं कि प्रदर्शन पर अधिक दूरगामी प्रभाव पड़ेगा, फिर अपने प्रोसेसर के बारे में कुछ अतिरिक्त गणित करने की चिंता करना।

(कृपया ध्यान दें कि मैं थोड़ा विनोदी हो रहा हूं, और इसलिए इस पोस्ट से कुछ भी गंभीरता से नहीं लेना चाहिए, अन्य तो यह विचार है कि अन्य चीजें हैं जिन्हें आपको पहले अनुकूलित करना चाहिए, और 2-3 स्तर के गहरे वजन के बारे में चिंता करने में मदद नहीं कर रहा है आपका स्वास्थ्य)


2
लिया, और अनिवार्य रूप से सहमत हैं, लेकिन औसत अमेरिकी घरेलू फ्रिज के रूप में एक वर्ष में ऊर्जा की एक ही राशि के आसपास औसत iPhone उपयोग (वेब ​​सेवाओं / साइट जो इसका उपयोग करते हैं) सहित सुना है। इसलिए हमारी जिम्मेदारी है कि डेवलपर्स इस तरह के पर्यावरणीय प्रभाव को ध्यान में रखें। जाहिर है इसका हमेशा एक संतुलन बनाने वाला कार्य: समय, लागत, प्रदर्शन, स्थिरता, और आम तौर पर मैं आपके दृष्टिकोण से सहमत हूं - लेकिन बस हमें इस तरह के प्रभाव पर भी विचार करना चाहिए। जाहिर है कि रखरखाव / विस्तार भी इसमें आता है। किसी भी तरह - बिंदु बनाया और धन्यवाद।
मेमेवेदर

प्रश्न में विशिष्ट बिंदु का एहसास डिवाइस पर प्रसंस्करण के बारे में है न कि वेब पर, लेकिन ओपी की बारीकियों से अधिक डेवलपर्स के रूप में प्राथमिकताओं के बारे में एक सामान्य बिंदु के रूप में मेरी टिप्पणी का मतलब है।
मेमेवेदर

11

नेस्टेड वेट खराब होने का मुख्य कारण यह है कि जब एक लेआउट में वजन के साथ बच्चे होते हैं, तो इसे दो बार मापा जाना चाहिए (मुझे लगता है कि यह लिंट-वार्निंग में उल्लेख किया गया है)। इसका मतलब यह है कि एक भारित लेआउट जिसमें एक भारित लेआउट भी शामिल है उसे चार बार मापा जाना चाहिए, और प्रत्येक वजन की 'परत' जो आप दो की शक्ति के साथ माप बढ़ाते हैं।

आईसीएस (एपीआई स्तर 14) में GridLayoutजोड़ा गया था, जो कई लेआउट्स के लिए सरल और 'फ्लैट' समाधान की अनुमति देता है जो पहले भार की आवश्यकता होती थी। यदि आप एंड्रॉइड के पुराने संस्करणों के लिए विकसित कर रहे हैं, तो आपके पास वजन को हटाने के लिए थोड़ा कठिन समय होगा, लेकिन RelativeLayoutउस कैब में अपने लेआउट के जितना संभव हो सके एक सपाट का उपयोग करके आमतौर पर नेस्टेड वेट को हटा दें।


9
मुझे नहीं लगता कि आप के साथ GridLayout या एक ही परिणाम प्राप्त कर सकते हैं RelativeLayout। उदाहरण के लिए GridLayout: "GridLayout वजन के सिद्धांत के लिए समर्थन प्रदान नहीं करता है, जैसा कि वजन में परिभाषित किया गया है। सामान्य तौर पर, कई घटकों के बीच अतिरिक्त स्थान को वितरित करने के लिए GridLayout को कॉन्फ़िगर करना संभव नहीं है।"
टिम्मम

एपीआई 21 में वजन की धारणा को ग्रिडलाइयूट में जोड़ा गया था। पुराने Android उपकरणों का समर्थन करने के लिए, आप v7 समर्थन लाइब्रेरी से ग्रिडलाइउट का उपयोग कर सकते हैं। android.support.v7.widget.GridLayout
свансгелист इवांसजेलिस्ट

2

वजन के साथ नेस्टेड लिनियरलैयूट से बचने के लिए एक आसान उपाय है - बस वेटसम के साथ टेबलवेलआउट और वेटसुम के साथ नेस्टेड लिनियरलैटआउट का उपयोग करें - टेबललेआउट में लिनियरलाइट (ओरिएंटेशन, वेटसम, लेआउट_वेट, आदि) के समान गुण हैं और संदेश नहीं दिखाता है - "नेस्टेड वेट्स। प्रदर्शन के लिए बुरा है "

उदाहरण:

 <TableLayout
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:orientation="vertical"
        android:weightSum="1">

        <ImageView
            android:layout_width="match_parent"
            android:layout_height="0dp"
            android:layout_weight="0.8"/>


        <LinearLayout
            android:layout_width="match_parent"
            android:layout_height="0dp"
            android:layout_weight="0.2"
            android:orientation="horizontal"
            android:weightSum="1">


            <ImageView
                android:layout_height="match_parent"
                android:layout_width="0dp"
                android:layout_weight="0.4"/>

            <TextView
                android:layout_height="match_parent"
                android:layout_width="0dp"
                android:layout_weight="0.6"/>


            </LinearLayout>

    </TableLayout>

1

मुझे लगता है, एकमात्र विकल्प एक फ़ंक्शन बनाना है जिसे onResume कहा जाएगा और सभी आकार और स्थिति सेट करेगा। वैसे भी, वजन से आप केवल आकार निर्धारित कर सकते हैं, लेकिन कोई पैडिंग्स (इसलिए लेआउट और भी जटिल हो जाते हैं), कोई भी टेक्स्टसाइज़ (यह किसी भी तरह से क्षतिपूर्ति करना असंभव है), अकेले ऐसी चीज़ों को लाइनों की संख्या दें।

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