क्या एंड्रॉइड में नकारात्मक मार्जिन का उपयोग करना एक बुरा अभ्यास है?


114

नकारात्मक मार्जिन का डेमो:

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

परिदृश्य

उनमें से एक के लिए एक नकारात्मक मार्जिन सेट करके विचारों को ओवरलैप करना ताकि यह दूसरे दृश्य के बाउंडिंग बॉक्स पर हमला करे।

विचार

ऐसा लगता है कि लेआउट के ओवरलैपिंग के साथ आप जिस तरह की अपेक्षा करेंगे, वह काम करेगा। लेकिन मैं अनजाने में चीजों को सही नहीं करने के लिए एक बड़ी समस्या में भागना नहीं चाहता। एमुलेटर, भौतिक उपकरण, आप इसे नाम देते हैं, जब आप नकारात्मक मार्जिन का उपयोग करते हैं तो सब कुछ सही ढंग से काम करने लगता है, एक दृश्य दूसरे के विचारों को बाउंडिंग बॉक्स पर आक्रमण करता है और यह इस बात पर निर्भर करता है कि लेआउट में यह कैसे घोषित किया गया है।

मैं यह भी पता एपीआई 21 के बाद से हम सेट कर सकते हैं कि कर रहा हूँ translationZऔर elevation दृश्य के ऊपर या अन्य विचार नीचे दिखाई देते हैं बनाने के लिए जिम्मेदार बताते हैं लेकिन मेरी चिंता का विषय मूल रूप से तथ्य यह है कि से आता दस्तावेज में के लिए layout_marginगुण यह स्पष्ट रूप से निर्दिष्ट है कि मार्जिन मूल्यों सकारात्मक होना चाहिए , चलो मुझे बोली:

उद्धरण:
इस दृश्य के बाएं, ऊपर, दाएं और नीचे की तरफ अतिरिक्त स्थान निर्दिष्ट करता है। यह स्थान इस दृश्य की सीमा के बाहर है। मार्जिन का मान सकारात्मक होना चाहिए । एक आयाम मान होना चाहिए, जो कि "14.5sp" जैसी इकाई के साथ जोड़ा गया एक फ्लोटिंग पॉइंट नंबर है। उपलब्ध इकाइयाँ हैं: px (पिक्सेल), dp (घनत्व-स्वतंत्र पिक्सेल), sp (पसंदीदा फ़ॉन्ट आकार पर आधारित पिक्सेल), (इंच), mm (मिलीमीटर) ...

मूल रूप से इस सवाल को पूछने के बाद से मैंने नकारात्मक मार्जिन के साथ कोई समस्या नहीं की है, जितना संभव हो उतना उनका उपयोग करने से बचने की कोशिश की, लेकिन किसी भी मुद्दे का सामना नहीं किया , इसलिए भले ही दस्तावेज में कहा गया है कि, मैं भी नहीं हूं इसकी चिंता है।


1
मुझे पता है कि एस्प्रेसो परीक्षण वस्तु को देखने में सक्षम नहीं होगा यदि उसका कोई मार्जिन नकारात्मक हो ... तो इसका उपयोग न करने का एक कारण है
टिम बोलैंड

जवाबों:


192

2010 में, @RomainGuy (कोर एंड्रॉइड इंजीनियर) ने कहा कि नकारात्मक मार्जिन का अनिर्दिष्ट व्यवहार था

2011 में, @RomainGuy ने कहा कि आप पर LinearLayoutऔर नकारात्मक मार्जिन का उपयोग कर सकते हैंRelativeLayout

2016 में, @RomainGuy ने कहा कि उन्हें आधिकारिक रूप से कभी समर्थन नहीं मिला है और उन्हें समर्थन नहीं दिया जाएगाConstraintLayout

हालांकि इस सीमा के आसपास काम करना आसान है।

अपने आधार दृश्य के निचले भाग में एक सहायक दृश्य (ऊंचाई 0dp, चौड़ाई अभिभावक के लिए विवश) जोड़ें, तल पर इच्छित मार्जिन जोड़ें।
फिर अपना दृष्टिकोण इस एक के नीचे रखें, प्रभावी रूप से इसे "नकारात्मक" मार्जिन की अनुमति दें, लेकिन बिना किसी असमर्थित नकारात्मक मान का उपयोग किए बिना।


1
एक हानिरहित बात होने लगती है, अगर किसी को कुछ अन्य जानकारी हो तो खुला छोड़ देना
जुआन कोर्टेस

1
@DrewLeSueur: मैं वह धारणा नहीं बनाऊंगा। मुझे नहीं पता कि नकारात्मक पैडिंग का क्या मतलब होगा।
कॉमन्सवेयर

1
@CommonsWare आप मुझे बता सकते हैं, क्या यह संभव है कि ऐसा कुछ `- @ डिमेन / एनलव्यू 'हो? मैं कॉल वैल्यू घोषित करना चाहता हूं, लेकिन नकारात्मक। मदद।
deadfish

2
@ 100 किग्रा: क्षमा करें, लेकिन यह समर्थित नहीं है।
कॉमन्सवेअर

21
मैंने देखा कि एंड्रॉइड 4.4 किटकैट में, नकारात्मक मार्जिन के संबंध में कुछ बदल गया है (4.3 की तुलना में, कम से कम आसुस नेक्सस 7 पर)। आपको जरूरत है android:clipChildren="false"और android:clipToPadding="false"जहां आप पहले नहीं थे, या चीजें इस तरह से टूट जाती हैं
जोनीक

18

आशा है कि यह किसी की मदद करेगा। यहाँ ConstraintLayout@ कॉमन्सवेयर के उत्तर के आधार पर नमूना कोड काम कर रहा है :

अपने आधार दृश्य के निचले भाग में एक सहायक दृश्य (ऊँचाई 0dp, चौड़ाई अभिभावक के लिए विवश) जोड़ें, तल पर इच्छित मार्जिन जोड़ें। फिर अपना दृष्टिकोण इस एक के नीचे रखें, प्रभावी रूप से इसे "नकारात्मक" मार्जिन की अनुमति दें, लेकिन बिना किसी असमर्थित नकारात्मक मान का उपयोग किए बिना।

नमूना कोड:

<TextView
    android:id="@+id/below"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:background="#F1B36D"
    android:padding="30dp"
    android:text="I'm below"
    android:textColor="#ffffff"
    android:textSize="48sp"
    android:textAlignment="center"
    tools:layout_editor_absoluteX="129dp"
    tools:layout_editor_absoluteY="0dp" />

<android.support.v4.widget.Space
    android:id="@+id/space"
    android:layout_width="0dp"
    android:layout_height="0dp"
    android:layout_marginBottom="32dp"
    app:layout_constraintBottom_toBottomOf="@+id/below"
    app:layout_constraintLeft_toLeftOf="@id/below"
    app:layout_constraintRight_toRightOf="@id/below" />

<TextView
    android:id="@+id/top"
    android:layout_width="100dp"
    android:layout_height="60dp"
    android:textAlignment="center"
    android:textColor="#ffffff"
    android:text="I'M ON TOP!"
    android:background="#676563"
    app:layout_constraintLeft_toLeftOf="parent"
    app:layout_constraintRight_toRightOf="parent"
    app:layout_constraintTop_toBottomOf="@+id/space" />

आउटपुट:

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


16

यदि आप नकारात्मक मार्जिन का उपयोग करना चाहते हैं, तो कंटेनर के लिए पर्याप्त पैडिंग सेट करें और इसके क्लिपटाउडिंग के लिए झूठे और नकारात्मक मार्जिन सेट करें यह बच्चों के लिए है इसलिए यह बच्चे के दृश्य को क्लिप नहीं करेगा!


4

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


3

मेरे लिए, और TextView पर एक नकारात्मक मार्जिन सेट करने के बारे में (मुझे पता है कि ओपी एक व्यूग्रुप का उल्लेख कर रहा है, लेकिन मैं नकारात्मक मार्जिन सेट करने के मुद्दों की तलाश कर रहा था और मैं यहां उतरा) ... मुझे 4.0.3 के साथ एक समस्या मिली ( एपीआई 15) केवल और की सेटिंग android:layout_marginTopयाandroid:layout_marginBottom इस तरह के -2dp के रूप में एक नकारात्मक मूल्य के लिए।

किसी कारण से TextView बिल्कुल भी प्रदर्शित नहीं होता है। यह दृश्य ("सिर्फ अदृश्य नहीं) से" चला गया "प्रतीत होता है।

जब मैंने Layout_margin के अन्य 3 संस्करणों के साथ यह कोशिश की, तो मुझे यह समस्या दिखाई नहीं दी।

ध्यान दें कि मैंने इसे असली डिवाइस पर आज़माया नहीं है, यह एक 4.0.3 एमुलेटर का उपयोग कर रहा है। यह दूसरी अजीब बात है जो मैंने पाया है कि केवल २०१३ से प्रभावित है, इसलिए मेरा नया नियम हमेशा से है एक 4.0.3 एमुलेटर के साथ परीक्षण करना है :)

मुझे टेक्स्ट व्यू के निचले मार्जिन को कम करने के साथ सफलता मिली है, android:lineSpacingExtra="-2dp"जिसके उपयोग से मेरे पास होने के बावजूद काम करता है android:singleLine="true"(और इसलिए मैंने नहीं सोचा होगा कि लाइन रिक्ति एक कारक होगी)।


1
मुझे नेक्सस 4 (जो कि xhdpi है) और 4.2.2 पर समान व्यवहार मिला। एक लेआउट था जिसमें कोई गद्दी नहीं थी, हालांकि एक माता-पिता के लेआउट में गद्दी थी। नकारात्मक मार्जिन के साथ अंदर एक TextView था। 5.0 पर यह ठीक काम किया। नेक्सस 4 के लिए डिवाइस पर और एमुलेटर पर 4.2.2 पर, यह गायब हो जाता है। इसका समाधान पैडिंग को उस लेआउट में ले जाने का था, जिसमें टेक्स्ट व्यू था।
लूइल्यूई

3

नहीं, आपको उपयोग नहीं करना चाहिए negative margin। इसके बजाय आपको उपयोग करना चाहिए translate। यहां तक ​​कि अगर नकारात्मक मार्जिन कुछ समय काम करता है, जब आप लेआउट को प्रोग्रामेटिक रूप से बदलते हैं, तो अनुवाद में मदद मिलेगी। और जिस स्क्रीन पर आप मार्जिन का उपयोग करते हैं, उसे ओवरफ्लो नहीं कर सकते।


0

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

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