एक ConstraintLayout के अंदर Wrap_content दृश्य स्क्रीन के बाहर फैला है


132

मैं एक सरल चैट बबल को लागू करने का प्रयास कर रहा हूं ConstraintLayout। यही मैं हासिल करने की कोशिश कर रहा हूं:

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

हालांकि, wrap_contentबाधाओं के साथ ठीक से काम नहीं करने के लिए लगता है। यह मार्जिन का सम्मान करता है, लेकिन उपलब्ध स्थान की ठीक से गणना नहीं करता है। यहाँ मेरा लेआउट है:

<?xml version="1.0" encoding="utf-8"?>
<android.support.constraint.ConstraintLayout   xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="wrap_content">

    <TextView
        android:id="@+id/chat_message"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:padding="16dp"
        app:layout_constraintBottom_toBottomOf="parent"
        app:layout_constraintLeft_toLeftOf="parent"
        app:layout_constraintRight_toRightOf="parent"
        app:layout_constraintTop_toTopOf="parent"
        app:layout_constraintHorizontal_bias="0"
        tools:background="@drawable/chat_message_bubble"
        tools:text="Lorem ipsum dolor sit amet, consectetur adipiscing elit. Mauris sodales accumsan tortor at bibendum."
        android:layout_marginStart="64dp"
        android:layout_marginLeft="64dp"
        android:layout_marginEnd="32dp"
        android:layout_marginRight="32dp"
        android:layout_marginTop="8dp"
        android:layout_marginBottom="8dp" />
</android.support.constraint.ConstraintLayout>

यह निम्नानुसार प्रस्तुत करता है:

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

मैं उपयोग कर रहा हूं com.android.support.constraint:constraint-layout:1.0.0-beta4

क्या मुझसे कुछ गलत हो रही है? क्या यह एक बग है या सिर्फ एक अनुचित व्यवहार है? क्या मैं एक का उपयोग करके उचित व्यवहार प्राप्त कर सकता हूं ConstraintLayout(मुझे पता है कि मैं अन्य लेआउट का उपयोग कर सकता हूं, मैं ConstrainLayoutविशेष रूप से पूछ रहा हूं )।


क्या आप इसके अभिभावक बाधा लेआउट के साथ पाठ दृश्य पोस्ट कर सकते हैं? जैसा कि आप जानते हैं, माता-पिता के लेआउट के गुणों का बच्चे पर बहुत प्रभाव पड़ता है
मोहम्मद आतिफ

वैसे, आपके मामले में मुझे लगता है कि क्षैतिज पूर्वाग्रह अपराधी है। के दाईं ओर पूर्वाग्रह को हटाने का प्रयास करें
मोहम्मद आतिफ

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

1
समस्या सुनिश्चित करने के लिए क्षैतिज पूर्वाग्रह 0 है। मैं संभावित समाधानों की जांच करूंगा और इसे पोस्ट करूंगा क्योंकि मैं भी कुछ इसी तरह की बाधा के साथ काम कर रहा हूं।
मोहम्मद आतिफ

1
@ एसएमयू चैट बबल आता है tools:background="@drawable/chat_message_bubble"। इसे लागू करने के लिए आपको ड्रॉ करने योग्य फ़ोल्डर में chat_message_bubble.xml फ़ाइल बनानी होगी, फिर इस कोड को जोड़ना होगा: <shape xmlns:android="http://schemas.android.com/apk/res/android"> <solid android:color="#FB4382"/> <corners android:radius="10dip"/> </shape>
यूजीन ब्रूसोव

जवाबों:


242

आउटडेटेड: बेहतर उत्तर देखें

नहीं, आप वह नहीं कर सकते जो आप कॉन्स्ट्रेन्थ लयआउट से चाहते हैं क्योंकि यह आज (1.0 बीटा 4) है:

  • wrap_content केवल विजेट को खुद को मापने के लिए कहता है, लेकिन अंतिम बाधाओं के खिलाफ अपने विस्तार को सीमित नहीं करेगा
  • match_constraints(0dp) बाधाओं के खिलाफ विजेट के आकार को सीमित करेगा ... लेकिन wrap_contentछोटे (आपका पहला उदाहरण) होने पर भी उनका मिलान करेगा , जो कि आप भी नहीं चाहते हैं।

तो अभी, आप उस विशेष मामले के लिए भाग्य से बाहर हैं: - /

अब ... हम match_constraintsइस सटीक परिदृश्य से निपटने के लिए अतिरिक्त क्षमताओं को जोड़ने के बारे में सोच रहे हैं (व्यवहार करना wrap_contentजब तक कि आकार बाधाओं से अधिक न हो)।

मैं वादा नहीं कर सकता कि यह नया फीचर 1.0 रिलीज से पहले इसे बना देगा।

संपादित करें : हमने इस क्षमता को 1.0 में विशेषता के app:layout_constraintWidth_default="wrap"साथ जोड़ा (चौड़ाई 0dp पर सेट के साथ)। यदि सेट किया जाता है, तो विजेट में एक ही आकार होगा जैसे कि wra_content का उपयोग करना, लेकिन बाधाओं से सीमित होगा (अर्थात यह उनके बारे में विस्तार नहीं करेगा)

अपडेट अब उन टैगों को हटा दिया गया है, इसके बजाय लेआउट_ एक्सपोज़र = "WRAP_CONTENT" और लेआउट_constrainedWidth = "true" का उपयोग करें।


1
मेरे लिए एक सुपर मुद्दा है। मैं अभी कंपाउंड ड्रॉबल्स के साथ match_constraintsटेक्स्ट व्यू का उपयोग नहीं कर सकता क्योंकि अगर मैं इसे कंपैरिबल ड्रॉबल पर सेट करता हूं, तो यह बहुत ही सही टेक्स्ट पर भी होगा।
पॉल वोइत्सेक

2
@ निकोलसऑर्ड: क्या आप मेरी सहायता कर सकते हैं बाधा के साथ लेआउट, मुझे ऊपरी आधे में एक छवि है नीचे 0.4 और दिशानिर्देश के साथ सामग्री है, लेकिन जब मैं बाधा लेआउट को लपेटने के लिए सेट करता हूं_ तो केवल स्क्रीन के 0.4 (और आधे हिस्से को उठाता है) नीचे दिए गए साक्षात्कार नहीं दिखाई दे रहे हैं), मैंने app:layout_constraintWidth_default="wrap"भी इस्तेमाल किया , और पुस्तकालय का v1.0.2 लेकिन यह मदद नहीं करता है
चूहा-ए-तात-ए-तात रतौली

3
ऐप: लेआउट_कॉन्स्ट्रैंटविदथ_डेफ़ॉल्ट = 0dp के रूप में चौड़ाई के साथ "रैप" यह अच्छी तरह से करता है!
तुंजी_ड

11
यह प्रलेखन / निर्देशों में लागू होना चाहिए।
SQLiteNoob

6
क्या संपादित करने के लिए अधिक से अधिक प्रमुखता होनी चाहिए ? मूल के नीचे की तरह खो जाता है। उत्तर की सराहना करें। धन्यवाद @NicolasRoard
टॉम हावर्ड

276

अपडेट किया गया (कॉन्ट्राटाइनलआउट १.१। +)

के app:layout_constrainedWidth="true"साथ प्रयोग करेंandroid:layout_width="wrap_content"

पहले (पदावनत):

app:layout_constraintWidth_default="wrap" साथ में android:layout_width="0dp"


5
यह सच है, चूंकि कॉन्स्ट्रेन्थलाईट 1.1.0 बीटा 2, मेरा मानना ​​है। androidstudio.googleblog.com/2017/10/…
फ़िफ़र भेड़

2
यह अब 1.1 रिलीज में है: medium.com/google-developers/…
Esdras Lopez

स्टैकओवरफ़्लो प्यार! धन्यवाद इससे मुझे मदद मिली! रैप सामग्री रखें, लेकिन बाधा से परे कभी न जाएं! # टीआईएल
डेनिस एंडरसन

क्या जवाब है, यह पता नहीं था! धन्यवाद आदमी, विकल्प के साथ खेलने के 2 घंटे बाद यह एक इलाज का काम करता है!
dev2505

23

हां, जैसा कि निकोलसapp:layout_constraintWidth_default="wrap" रोअर्ड द्वारा दिए गए जवाब में बताया गया है कि आपको 0dp में चौड़ाई मिलानी चाहिए। और अपने बुलबुले को सही करने के लिए आपको 1.0 सेट करना चाहिए layout_constraintHorizontal_bias

यहाँ अंतिम स्रोत कोड है:

<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/chat_message"
        android:layout_width="0dp"
        android:layout_height="wrap_content"
        android:padding="16dp"
        android:layout_marginTop="8dp"
        android:layout_marginStart="64dp"
        android:layout_marginEnd="8dp"
        android:layout_marginBottom="8dp"
        app:layout_constraintHorizontal_bias="1.0"
        app:layout_constraintWidth_default="wrap"
        app:layout_constraintTop_toTopOf="parent"
        app:layout_constraintStart_toStartOf="parent"
        app:layout_constraintEnd_toEndOf="parent"
        app:layout_constraintBottom_toBottomOf="parent"
        android:background="@drawable/chat_message_bubble"
        android:text="Lorem ipsum dolor sit amet, consectetur adipiscing elit. Mauris sodales accumsan tortor at bibendum." />

</android.support.constraint.ConstraintLayout>

परिणामस्वरूप ऐसा दिखता है:

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


मुझे लगता है कि क्योंकि ओपी बाईं ओर छोटा बुलबुला चाहता है और आपका दायां है, जो आवश्यकताओं को बदलता है
Waza_Be

2
यहाँ महत्वपूर्ण हिस्सा हैapp:layout_constraintHorizontal_bias="1.0"
लेस्टर

9

पहले से ही कहे गए अन्य उत्तरों की तरह, कॉन्स्ट्रेन्थलाईट 1.0 के बाद से इसे प्राप्त करना संभव है, लेकिन नवीनतम रिलीज (1.1.x) के रूप में उन्होंने बदल दिया है कि आप इसे कैसे करते हैं।

ConstraintLayout 1.1 की रिलीज के बाद से पुरानी app:layout_constraintWidth_default="wrap"और app:layout_constraintHeight_default="wrap"विशेषताओं को अब हटा दिया गया है

यदि आप एक wrap_contentव्यवहार प्रदान करना चाहते हैं, लेकिन फिर भी अपने दृश्य पर बाधाओं को लागू करते हैं, तो आपको डॉक्स पर बताई गई और / या विशेषताओं wrap_contentके साथ संयुक्त करने के लिए इसकी चौड़ाई और / या ऊंचाई निर्धारित करनी चाहिए :app:layout_constrainedWidth=”true|false”app:layout_constrainedHeight=”true|false”

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

app: layout_constrainedWidth = "सही | गलत" ऐप: लेआउट_constrainedHe = "सही और गलत"

नवीनतम रिलीज के लिए, जब तक मैंने इसका उत्तर दिया है, तब तक कॉन्स्ट्रेण्टलैटआउट 1.1.2 संस्करण पर है


3

ऐप का डिप्रेसेशन: लेआउट_कॉस्ट्रैंटविदथ_डेफॉल्ट टेक्स्ट और इसका विकल्प

@ के निकोलस-roard के जवाब app:layout_constraintWidth_default="wrap"और android:layout_width="0dp"अब है DEPRECATED

आगे बढ़ो और उपयोग करें app:layout_constrainedWidth="true"और android:layout_width="wrap_content"

पदावनति का कारण, मुझे नहीं पता। लेकिन कांस्ट्रेन्थलाईट के स्रोत कोड में इसका अधिकार है


-7

मैं इस एक का उपयोग करें

app:layout_constraintEnd_toEndOf="parent"

यह ओपी का सवाल कैसे है? यह कैसे सामग्री लपेटता है?
एलेक्स

-8

आपको प्रतिस्थापित करना चाहिए

android:layout_width="wrap_content"

साथ में

android:layout_width="match_parent"

अपने TextView से और फिर तदनुसार पैडिंग और मार्जिन समायोजित करें। मैंने आपका कोड अपडेट कर दिया है,

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

<TextView
    android:id="@+id/chat_message"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:layout_marginBottom="8dp"
    android:layout_marginEnd="10dp"
    android:layout_marginLeft="60dp"
    android:layout_marginRight="10dp"
    android:layout_marginStart="60dp"
    android:layout_marginTop="8dp"
    android:padding="16dp"
    app:layout_constraintTop_toTopOf="parent"
    tools:background="#c9c7c7"
    tools:text="Lorem ipsum dolor sit amet, consectetur adipiscing elit. Mauris sodales accumsan tortor at bibendum." />

आपको यह परिणाम मिलेगा यहाँ छवि विवरण दर्ज करें


आपको किसी कॉन्स्ट्रेन्टलैटआउट में किसी भी दृश्य के लिए "match_parent" के उपयोग से बचना चाहिए। यहां
यूजीन ब्रूसोव
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.