GridLayout và Khoảng cách Hàng / Cột Khốn nạn


121

Bài đăng trên Blog dành cho nhà phát triển Android giới thiệuGridLayout sơ đồ này về cách các nhịp ảnh hưởng đến phân bổ chỉ mục tự động:

phân bổ chỉ mục tự động

Tôi đang cố gắng thực hiện điều đó bằng cách sử dụng a GridLayout. Đây là những gì tôi có cho đến nay:

<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>

Tôi phải giới thiệu các <Space>phần tử để đảm bảo mỗi cột có chiều rộng tối thiểu, nếu không, tôi sẽ có một loạt các cột có chiều rộng bằng không.

Tuy nhiên, ngay cả với họ, tôi nhận được điều này:

mẫu GridLayout

Đáng chú ý:

  • Mặc dù vậy android:layout_gravity="fill_horizontal", các tiện ích con của tôi có khoảng cách cột không lấp đầy các cột được kéo dài

  • Bất chấp các android:layout_rowSpangiá trị, không có gì kéo dài hàng

Bất cứ ai có thể tái tạo sơ đồ từ bài đăng trên blog bằng cách sử dụng một GridLayout?

Cảm ơn!


178
Tôi đoán ngay cả khi bạn đặt câu hỏi :)
StackOverflowed

Câu trả lời:


76

Nó cảm thấy khá khó hiểu, nhưng tôi đã cố gắng có được giao diện chính xác bằng cách thêm một cột và hàng bổ sung ngoài những gì cần thiết. Sau đó, tôi lấp đầy cột phụ bằng Dấu cách trong mỗi hàng xác định chiều cao và điền vào hàng phụ bằng Dấu cách trong mỗi cột xác định chiều rộng. Để có thêm tính linh hoạt, tôi tưởng tượng các Kích thước không gian này có thể được đặt trong mã để cung cấp một cái gì đó tương tự như trọng lượng. Tôi đã cố gắng thêm ảnh chụp màn hình, nhưng tôi không có danh tiếng cần thiết.

<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>

ảnh chụp màn hình


7
Chà, IMHO ngày càng ít hack hơn so với giải pháp khác được trình bày cho đến nay - ít nhất là ở đây, các kích thước có dây cứng nằm trong các Spacephần tử. Tôi đã thêm một ảnh chụp màn hình cho những người đọc trong tương lai. Cảm ơn!
CommonsWare

Tại sao lại là rowCount8? Chúng ta cần 4 hàng (kích thước của hàng lớn nhất rowSpan) cộng với hàng thừa Spaceđể có được 5. Tôi còn thiếu gì?
curioustechizen

Tôi chỉ đi với số lượng hàng và cột từ hình ảnh trong câu hỏi ban đầu (chính nó là từ một bài đăng trên blog của nhà phát triển Android). Sau đó, tôi thêm 1 vào số hàng và số cột để nhường chỗ cho các Dấu cách viền bên ngoài. Nó cũng sẽ hoạt động tốt với chỉ 5 hàng.
kturney

5
Tôi thấy rằng giải pháp này chỉ làm việc với <Gridlayout>như trái ngược với<android.support.v7.widget.GridLayout>
Didia

Làm cách nào để tôi có thể đặt động row_span và cột khoảng ... nó sẽ hoạt động?

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>

ScreenShot


2
Cảm ơn! Điều thú vị là nếu tôi chuyển sang GridLayouttừ gói Hỗ trợ Android, bố cục sẽ bị vỡ, cho thấy cả hai không hoàn toàn tương thích. Ngoài ra, tôi thực sự hy vọng rằng có một cách để làm điều này mà không liên quan đến kích thước dây cứng của các vật dụng. Tôi sẽ để điều này diễn ra một chút, để xem những câu trả lời khác đi kèm (nếu có), nhưng tôi sẽ chấp nhận câu trả lời của bạn nếu không có gì tốt hơn hiển thị. Cảm ơn một lần nữa!
CommonsWare

4
"nếu tôi chuyển sang GridLayout từ gói Hỗ trợ Android, bố cục bị hỏng" - thực ra, đó là lỗi của tôi, không chuyển đổi các android:thuộc tính cần thiết thành các thuộc tính app:, bằng cách sử dụng không gian tên XML của cổng sau. Nó hoạt động với cổng sau.
CommonsWare

Tôi đã tìm thấy một cách để có một số trong số chúng có kích thước động nhưng chỉ khi chiều rộng đầy đủ của các cột hoặc hàng đã được xác định bởi các khung nhìn liền kề. Tôi không nghĩ rằng chúng hoạt động giống như trọng lượng và phân phối không gian như nhau tùy thuộc vào các nhịp được xác định. Nó không hoàn hảo nhưng nó hoạt động hoàn hảo cho những gì tôi cần trong dự án hiện tại của mình.
HandlerExploit

Chà, ví dụ của bạn giống như một aproach của AbsoluteLayout được trộn với một aproach cho RelativeLayout, phải không? Điều này không phải là động cũng như di động. Chính xác thì tại sao bạn cần GridLayout cho việc này? Anyways, GridLayout được, IMHO, hoặc là bị hỏng hoặc còn dang dở ...
Bondax

@Bondax Việc triển khai này xác định rõ ràng mục lưới ở cả chiều cao, chiều rộng, chiều rộng cột và khoảng cột. Bố cục lưới sẽ làm nổi các mục lưới của bạn trong không gian hạn chế khi các độ rộng khác nhau được xác định cho lưới (chiều rộng màn hình). Đây là một yêu cầu cho một dự án và điều này đã giải quyết vấn đề một cách hoàn hảo.
HandlerExploit vào

6

Bạn phải đặt cả layout_gravity và layout_columntWeight trên các cột của mình

<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

Hỗ trợ Android V7 Thư viện GridLayout giúp phân phối không gian thừa dễ dàng bằng cách đáp ứng nguyên tắc trọng lượng. Để làm cho một cột căng ra, hãy đảm bảo rằng các thành phần bên trong nó xác định trọng lượng hoặc trọng lực. Để ngăn cột bị kéo căng, hãy đảm bảo rằng một trong các thành phần của cột không xác định trọng lượng hoặc trọng lực. Hãy nhớ thêm phụ thuộc cho thư viện này. Thêm com.android.support:gridlayout-v7:25.0.1 trong build.gradle.

<?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>

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.