ग्रिडलाइउट और रो / कॉलम स्पैन वे


121

Android डेवलपर ब्लॉग पोस्ट को शुरू करनेGridLayout से पता चलता है कि कैसे फैला स्वचालित सूचकांक आवंटन को प्रभावित के इस चित्र:

स्वचालित सूचकांक आवंटन

मैं वास्तव में इसे लागू करने का प्रयास कर रहा हूं GridLayout। यह है, जो कि अभी तक मेरे पास है:

<android.support.v7.widget.GridLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res/com.commonsware.android.gridlayout"
    android:layout_width="fill_parent"
    android:layout_height="fill_parent"
    app:orientation="horizontal"
    app:columnCount="8">

    <Button
        app:layout_columnSpan="2"
        app:layout_rowSpan="2"
        android:layout_gravity="fill_horizontal"
        android:text="@string/string_1"/>

  <Button
    app:layout_columnSpan="2"
    android:layout_gravity="fill_horizontal"
    android:text="@string/string_2"/>

  <Button
    app:layout_rowSpan="4"
    android:text="@string/string_3"/>

  <Button
    app:layout_columnSpan="3"
    app:layout_rowSpan="2"
    android:layout_gravity="fill_horizontal"
    android:text="@string/string_4"/>

  <Button
    app:layout_columnSpan="3"
    android:layout_gravity="fill_horizontal"
    android:text="@string/string_5"/>

  <Button
    app:layout_columnSpan="2"
    android:layout_gravity="fill_horizontal"
    android:text="@string/string_6"/>

  <android.support.v7.widget.Space
    app:layout_column="0"
    android:layout_width="36dp"
    />

  <android.support.v7.widget.Space
    android:layout_width="36dp"
    />

  <android.support.v7.widget.Space
    android:layout_width="36dp"
    />

  <android.support.v7.widget.Space
    android:layout_width="36dp"
    />

  <android.support.v7.widget.Space
    android:layout_width="36dp"
    />

  <android.support.v7.widget.Space
    android:layout_width="36dp"
    />

  <android.support.v7.widget.Space
    android:layout_width="36dp"
    />

  <android.support.v7.widget.Space
    android:layout_width="36dp"
    />

</android.support.v7.widget.GridLayout>

मुझे <Space>यह सुनिश्चित करने के लिए तत्वों को पेश करना था कि प्रत्येक कॉलम की न्यूनतम चौड़ाई होगी, अन्यथा, मेरे पास शून्य-चौड़ाई वाले स्तंभों का एक गुच्छा होगा।

हालांकि, उनके साथ भी, मुझे यह मिलता है:

नमूना GridLayout

विशेष रूप से:

  • बावजूद android:layout_gravity="fill_horizontal", स्तंभ फैला के साथ अपने विगेट्स फैला कॉलम को भरने नहीं है

  • android:layout_rowSpanमूल्यों के बावजूद , कुछ भी नहीं पंक्तियों

किसी एक का उपयोग कर ब्लॉग पोस्ट से आरेख पुन: पेश कर सकते हैं GridLayout?

धन्यवाद!


178
मुझे लगता है कि आप भी सवाल पूछते हैं :)
StackOverflowed

जवाबों:


76

यह बहुत हैकिंग लगता है, लेकिन मैं एक अतिरिक्त कॉलम और पंक्ति को जोड़कर सही रूप प्राप्त करने में कामयाब रहा, जो आवश्यक है। फिर मैंने प्रत्येक पंक्ति में एक ऊँचाई को परिभाषित करने वाले स्थान के साथ अतिरिक्त कॉलम को भरा और प्रत्येक पंक्ति में एक चौड़ाई को परिभाषित करने वाले स्थान के साथ अतिरिक्त पंक्ति को भर दिया। अतिरिक्त लचीलेपन के लिए, मुझे लगता है कि इन अंतरिक्ष आकारों को भार के समान कुछ प्रदान करने के लिए कोड में सेट किया जा सकता है। मैंने एक स्क्रीनशॉट जोड़ने की कोशिश की, लेकिन मेरे पास प्रतिष्ठा आवश्यक नहीं है।

<GridLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:columnCount="9"
android:orientation="horizontal"
android:rowCount="8" >

<Button
    android:layout_columnSpan="2"
    android:layout_gravity="fill"
    android:layout_rowSpan="2"
    android:text="1" />

<Button
    android:layout_columnSpan="2"
    android:layout_gravity="fill_horizontal"
    android:text="2" />

<Button
    android:layout_gravity="fill_vertical"
    android:layout_rowSpan="4"
    android:text="3" />

<Button
    android:layout_columnSpan="3"
    android:layout_gravity="fill"
    android:layout_rowSpan="2"
    android:text="4" />

<Button
    android:layout_columnSpan="3"
    android:layout_gravity="fill_horizontal"
    android:text="5" />

<Button
    android:layout_columnSpan="2"
    android:layout_gravity="fill_horizontal"
    android:text="6" />

<Space
    android:layout_width="36dp"
    android:layout_column="0"
    android:layout_row="7" />

<Space
    android:layout_width="36dp"
    android:layout_column="1"
    android:layout_row="7" />

<Space
    android:layout_width="36dp"
    android:layout_column="2"
    android:layout_row="7" />

<Space
    android:layout_width="36dp"
    android:layout_column="3"
    android:layout_row="7" />

<Space
    android:layout_width="36dp"
    android:layout_column="4"
    android:layout_row="7" />

<Space
    android:layout_width="36dp"
    android:layout_column="5"
    android:layout_row="7" />

<Space
    android:layout_width="36dp"
    android:layout_column="6"
    android:layout_row="7" />

<Space
    android:layout_width="36dp"
    android:layout_column="7"
    android:layout_row="7" />

<Space
    android:layout_height="36dp"
    android:layout_column="8"
    android:layout_row="0" />

<Space
    android:layout_height="36dp"
    android:layout_column="8"
    android:layout_row="1" />

<Space
    android:layout_height="36dp"
    android:layout_column="8"
    android:layout_row="2" />

<Space
    android:layout_height="36dp"
    android:layout_column="8"
    android:layout_row="3" />

<Space
    android:layout_height="36dp"
    android:layout_column="8"
    android:layout_row="4" />

<Space
    android:layout_height="36dp"
    android:layout_column="8"
    android:layout_row="5" />

<Space
    android:layout_height="36dp"
    android:layout_column="8"
    android:layout_row="6" />

</GridLayout>

स्क्रीनशॉट


7
खैर, IMHO जो कि आज तक प्रस्तुत किए गए दूसरे समाधान की तुलना में बहुत कम हैची है - कम से कम यहां, हार्ड-वायर्ड आकार के Spaceतत्व हैं। मैंने भविष्य के पाठकों के लिए एक स्क्रीनशॉट जोड़ा। धन्यवाद!
कॉमन्सवेयर

rowCount8 को सेट क्यों किया जाता है ? हमें 4 पंक्तियों (सबसे बड़े आकार rowSpan) की आवश्यकता है और इसके लिए अतिरिक्त एक Spaceहोना चाहिए। 5. मुझे क्या याद आ रहा है?
क्यूरियोटेकिनिज़न

मैं मूल प्रश्न में चित्र से पंक्ति और स्तंभ मायने रखता हूं (जो कि खुद एंड्रॉइड देव ब्लॉग पोस्ट से है)। मैंने इसके बाद 1 से पंक्ति और कॉलम को बाहर की सीमा के रिक्त स्थान के लिए जगह बनाने के लिए जोड़ा। यह सिर्फ 5 पंक्तियों के साथ ठीक काम करना चाहिए।
kturney

5
मुझे लगता है कि यह समाधान केवल <Gridlayout>विरोध के साथ काम करता है<android.support.v7.widget.GridLayout>
दीदिया

मैं गतिशील रूप से row_span और कॉलम स्पैन कैसे सेट कर सकता हूं ... यह काम करेगा?

17
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="fill_parent"
    android:layout_height="fill_parent" >

    <GridLayout
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_centerInParent="true"
        android:columnCount="8"
        android:rowCount="7" >

        <TextView
            android:layout_width="50dip"
            android:layout_height="50dip"
            android:layout_columnSpan="2"
            android:layout_rowSpan="2"
            android:background="#a30000"
            android:gravity="center"
            android:text="1"
            android:textColor="@android:color/white"
            android:textSize="20dip" />

        <TextView
            android:layout_width="50dip"
            android:layout_height="25dip"
            android:layout_columnSpan="2"
            android:layout_rowSpan="1"
            android:background="#0c00a3"
            android:gravity="center"
            android:text="2"
            android:textColor="@android:color/white"
            android:textSize="20dip" />

        <TextView
            android:layout_width="25dip"
            android:layout_height="100dip"
            android:layout_columnSpan="1"
            android:layout_rowSpan="4"
            android:background="#00a313"
            android:gravity="center"
            android:text="3"
            android:textColor="@android:color/white"
            android:textSize="20dip" />

        <TextView
            android:layout_width="75dip"
            android:layout_height="50dip"
            android:layout_columnSpan="3"
            android:layout_rowSpan="2"
            android:background="#a29100"
            android:gravity="center"
            android:text="4"
            android:textColor="@android:color/white"
            android:textSize="20dip" />

        <TextView
            android:layout_width="75dip"
            android:layout_height="25dip"
            android:layout_columnSpan="3"
            android:layout_rowSpan="1"
            android:background="#a500ab"
            android:gravity="center"
            android:text="5"
            android:textColor="@android:color/white"
            android:textSize="20dip" />

        <TextView
            android:layout_width="50dip"
            android:layout_height="25dip"
            android:layout_columnSpan="2"
            android:layout_rowSpan="1"
            android:background="#00a9ab"
            android:gravity="center"
            android:text="6"
            android:textColor="@android:color/white"
            android:textSize="20dip" />
    </GridLayout>

</RelativeLayout>

स्क्रीनशॉट


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

4
"अगर मैं एंड्रॉइड सपोर्ट पैकेज से ग्रिडलायूट पर स्विच करता हूं, तो लेआउट टूट जाता है" - वास्तव में, यह मेरी गलती थी, आवश्यक android:विशेषताओं को app:लोगों के लिए परिवर्तित नहीं कर रहा था, बैकपोर्ट के एक्सएमएल नेमस्पेस का उपयोग कर रहा था। यह बैकपोर्ट के साथ काम करता है।
कॉमन्सवेअर

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

ठीक है, आपका उदाहरण एब्सोल्यूटलेयआउट के एप्रोच की तरह अधिक है, जो कि रिलेलेटिवआउट के लिए एक के साथ मिला है, है न? यह न तो गतिशील है और न ही पोर्टेबल है। इसके लिए आपको वास्तव में एक GridLayout की आवश्यकता क्यों है? वैसे भी, GridLayout, imho है, या तो टूट गया या अधूरा ...
बॉन्डैक्स

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

6

आपको अपने स्तंभों पर दोनों लेआउट_ग्रेविटी और लेआउट_ कोल्युमेंटटाइट सेट करना होगा

<android.support.v7.widget.GridLayout
    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="wrap_content">

    <TextView android:text="سوم شخص"
        app:layout_gravity="fill_horizontal"
        app:layout_columnWeight="1"
        />

    <TextView android:text="دوم شخص"
        app:layout_gravity="fill_horizontal"
        app:layout_columnWeight="1"
        />

    <TextView android:text="اول شخص"
        app:layout_gravity="fill_horizontal"
        app:layout_columnWeight="1"
        />
 </android.support.v7.widget.GridLayout>

2

Android समर्थन V7 GridLayout पुस्तकालय वजन के सिद्धांत को समायोजित करके अतिरिक्त स्थान वितरण को आसान बनाता है। एक स्तंभ खिंचाव बनाने के लिए, सुनिश्चित करें कि इसके अंदर के घटक एक भार या गुरुत्वाकर्षण को परिभाषित करते हैं। किसी कॉलम को स्ट्रेचिंग से रोकने के लिए, सुनिश्चित करें कि कॉलम में कोई एक घटक वजन या गुरुत्वाकर्षण को परिभाषित नहीं करता है। इस पुस्तकालय के लिए निर्भरता जोड़ना याद रखें। Build.gradle में com.android.support:gridlayout-v7:25.0.1 जोड़ें ।

<?xml version="1.0" encoding="utf-8"?>
<android.support.v7.widget.GridLayout 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"
app:columnCount="2"
app:rowCount="2">

<TextView
    android:layout_width="0dp"
    android:layout_height="0dp"
    android:gravity="center"
    android:text="First"
    app:layout_columnWeight="1"
    app:layout_rowWeight="1" />

<TextView
    android:layout_width="0dp"
    android:layout_height="0dp"
    android:gravity="center"
    android:text="Second"
    app:layout_columnWeight="1"
    app:layout_rowWeight="1" />

<TextView
    android:layout_width="0dp"
    android:layout_height="0dp"
    android:gravity="center"
    android:text="Third"
    app:layout_columnWeight="1"
    app:layout_rowWeight="1" />

<TextView
    android:layout_width="0dp"
    android:layout_height="0dp"
    android:gravity="center"        
    app:layout_columnWeight="1"
    app:layout_rowWeight="1"
    android:text="fourth"/>

</android.support.v7.widget.GridLayout>

1

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

https://stackoverflow.com/a/31089200/1296944

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