Android Lollipop:无法在 GridLayout 中包含外部布局

Android Lollipop: Cannot include an external layout inside of a GridLayout

我正在尝试在 GridLayout 中包含一个包含 GridLayout 的外部布局文件。我的代码适用于 API 23+,但不适用于 API 21 或 API 22 (Lollipop)。下面是我的 activity_main.xml 代码,其中包含布局 textcomparator.xml

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout 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:orientation="vertical"
    android:layout_width="match_parent"
    android:layout_height="match_parent">
    <ScrollView
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:background="#ffffff"
        android:layout_weight="1"
        android:fillViewport="true">

        <GridLayout
            android:layout_width="match_parent"
            android:layout_height="match_parent"
            android:background="#ffffff"
            android:columnCount="1"
            android:orientation="vertical"
            android:rowCount="1"
            tools:context=".MainActivity">

            <!-- Text comparison UI -->
            <include
                android:id="@+id/text_comparator"
                layout="@layout/textcomparator"
                android:layout_width="match_parent"
                android:layout_height="wrap_content"
                android:layout_row="0"
                android:layout_column="0"
                android:layout_weight="1"
                android:visibility="visible" />

        </GridLayout>
    </ScrollView>
</LinearLayout>

下面是我的 textcomparator.xml 代码:

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:orientation="vertical" android:layout_width="match_parent"
    android:layout_height="match_parent">
    <GridLayout
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:rowCount="1"
        android:columnCount="2">

        <EditText
            android:id="@+id/textbox"
            android:layout_width="0dp"
            android:layout_height="match_parent"
            android:layout_row="0"
            android:layout_column="0"
            android:layout_columnWeight="1"
            android:gravity="left|top"
            android:hint="Text 1"
            android:inputType="textMultiLine"
            android:padding="10dp"
            android:text="" />

        <EditText
            android:id="@+id/textbox2"
            android:layout_width="0dp"
            android:layout_height="match_parent"
            android:layout_row="0"
            android:layout_column="1"
            android:layout_columnWeight="1"
            android:gravity="left|top"
            android:hint="Text 2"
            android:inputType="textMultiLine"
            android:padding="10dp"
            android:text="" />
    </GridLayout>
</LinearLayout>

下面是 API 22 的屏幕截图(不工作): 下面是 API 23 (working) 的屏幕截图:

尝试使用 Gradle,并在您的 build.gradle 文件末尾添加以下部分:

dependencies {
  implementation 'com.android.support:gridlayout-v7:28.0.0'
  implementation 'com.android.support:appcompat-v7:28.0.0'
}

然后执行assembleDebug gradle任务。

我似乎记得 GridLayout 在框架中的实现在 API 23 之前有点错误。 TextViews 在 APIs 21 和 22 中的宽度为零。(您可以在 Android Studio 的布局检查器中看到这一点 - Tools->Layout Inspector。)这是因为布局权重不起作用。您应该使用实际上效果更好的 AndroidX 版本。

implementation "androidx.gridlayout:gridlayout:1.0.0"

支持库版本也可以。

这是使用 AndroidX 编写代码的样子。我认为支持库的 XML 将是相同的,除非您引用 GridLayout 的支持库版本而不是 AndroidX 版本。

<LinearLayout 
    android:orientation="vertical"
    android:layout_width="match_parent"
    android:layout_height="match_parent">
    <ScrollView
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:background="#ffffff"
        android:layout_weight="1"
        android:fillViewport="true">

        <androidx.gridlayout.widget.GridLayout
            android:layout_width="match_parent"
            android:layout_height="match_parent"
            android:background="#ffffff"
            app:columnCount="1"
            app:orientation="vertical"
            app:rowCount="1"
            tools:context=".MainActivity">

            <!-- Text comparison UI -->
            <include
                android:id="@+id/text_comparator"
                layout="@layout/textcomparator"
                android:layout_width="match_parent"
                android:layout_height="wrap_content"
                app:layout_row="0"
                app:layout_column="0"
                android:layout_weight="1"
                android:visibility="visible" />

        </androidx.gridlayout.widget.GridLayout>
    </ScrollView>
</LinearLayout>

以及包含的文件:

<LinearLayout 
    android:orientation="vertical"
    android:layout_width="match_parent"
    android:layout_height="match_parent">
    <androidx.gridlayout.widget.GridLayout
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        app:rowCount="1"
        app:columnCount="2">

        <EditText
            android:id="@+id/textbox"
            android:layout_width="0dp"
            android:layout_height="match_parent"
            app:layout_row="0"
            app:layout_column="0"
            app:layout_columnWeight="1"
            android:gravity="left|top"
            android:hint="Text 1"
            android:inputType="textMultiLine"
            android:padding="10dp"
            android:text="" />

        <EditText
            android:id="@+id/textbox2"
            android:layout_width="0dp"
            android:layout_height="match_parent"
            app:layout_row="0"
            app:layout_column="1"
            app:layout_columnWeight="1"
            android:gravity="left|top"
            android:hint="Text 2"
            android:inputType="textMultiLine"
            android:padding="10dp"
            android:text="" />
    </androidx.gridlayout.widget.GridLayout>
</LinearLayout>

在模拟器上的快速测试 运行 API 22 显示如下:

这是预期的结果。

如果您使用 androidx 那么这个 可以,但是如果您不使用 androidx 那么请按照以下说明操作:

1.Add app.gradle 文件中的以下依赖项

implementation 'com.android.support:gridlayout-v7:28.0.0' 

2.Replace GridLayout android.support.v7.widget.GridLayout textcomparator.xmlactivity_main.xml 布局文件

3.Replace 以下所有属性

android:rowCount
android:columnCount
android:orientation
android:layout_row
android:layout_column
android:layout_columnWeight

具有这些属性

app:rowCount
app:columnCount
app:orientation
app:layout_row
app:layout_column
app:layout_columnWeight

你的最终代码应该是这样的:

activity_main.xml

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout 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:orientation="vertical"
    android:layout_width="match_parent"
    android:layout_height="match_parent">
    <ScrollView
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:background="#ffffff"
        android:layout_weight="1"
        android:fillViewport="true">

        <android.support.v7.widget.GridLayout
            android:layout_width="match_parent"
            android:layout_height="match_parent"
            android:background="#ffffff"
            app:columnCount="1"
            app:orientation="vertical"
            app:rowCount="1"
            tools:context=".MainActivity">

            <!-- Text comparison UI -->
            <include
                android:id="@+id/text_comparator"
                layout="@layout/textcomparator"
                android:layout_width="match_parent"
                android:layout_height="wrap_content"
                app:layout_row="0"
                app:layout_column="0"
                android:layout_weight="1"
                android:visibility="visible" />

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

textcomparator.xml

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    android:orientation="vertical"
    android:layout_width="match_parent"
    android:layout_height="match_parent">
    <android.support.v7.widget.GridLayout
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        app:rowCount="1"
        app:columnCount="2">

        <EditText
            android:id="@+id/textbox"
            android:layout_width="0dp"
            android:layout_height="match_parent"
            app:layout_row="0"
            app:layout_column="0"
            app:layout_columnWeight="1"
            android:gravity="left|top"
            android:hint="Text 1"
            android:inputType="textMultiLine"
            android:padding="10dp"
            android:text="" />

        <EditText
            android:id="@+id/textbox2"
            android:layout_width="0dp"
            android:layout_height="match_parent"
            app:layout_row="0"
            app:layout_column="1"
            app:layout_columnWeight="1"
            android:gravity="left|top"
            android:hint="Text 2"
            android:inputType="textMultiLine"
            android:padding="10dp"
            android:text="" />
    </android.support.v7.widget.GridLayout>
</LinearLayout>

我已经在 API 21 上测试过,效果很好。