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.xml
和 activity_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 上测试过,效果很好。
我正在尝试在 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 的屏幕截图(不工作):
尝试使用 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.xml
和 activity_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 上测试过,效果很好。