【问题标题】:Why does this layout work in preview but not on my device?为什么此布局在预览中有效,但在我的设备上无效?
【发布时间】:2016-01-26 15:24:37
【问题描述】:

我正在为学校开发一个 Android 应用程序。在 Android Studio 的预览版中,我制定的布局对我来说看起来不错,但是一旦我将它部署到我的物理设备(HTC One m8,Android 5.0.1)上,cardview 中的所有内容都搞砸了。

布局文件:

<?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:layout_width="match_parent"
    android:orientation="vertical"
    android:layout_height="match_parent"
    android:paddingBottom="@dimen/activity_vertical_margin"
    android:paddingLeft="@dimen/activity_horizontal_margin"
    android:paddingRight="@dimen/activity_horizontal_margin"
    android:paddingTop="@dimen/activity_vertical_margin"
    app:layout_behavior="@string/appbar_scrolling_view_behavior"
    tools:context="de.seschi98.trgapp.activities.ScheduleActivity"
    tools:showIn="@layout/activity_schedule">



    <android.support.v7.widget.CardView
        android:id="@+id/card_view"
        android:layout_width="match_parent"
        android:layout_height="120dp">


        <GridLayout
            xmlns:android="http://schemas.android.com/apk/res/android"
            android:layout_width="match_parent"
            android:layout_height="match_parent"
            android:columnCount="4"
            android:rowCount="1"
            android:columnOrderPreserved="false"
            android:orientation="horizontal"
            android:rowOrderPreserved="false">

            <TextView
                android:id="@+id/lesson_number"
                android:text="01"
                android:textSize="22dp"
                android:layout_width="wrap_content"
                android:layout_column="0"
                android:layout_row="0"
                android:layout_rowWeight="1"
                android:gravity="center_vertical|center_horizontal"
                android:textStyle="bold"
                android:layout_columnWeight="20" />

            <GridLayout
                xmlns:android="http://schemas.android.com/apk/res/android"
                android:layout_column="1"
                android:layout_row="0"
                android:columnCount="2"
                android:layout_columnWeight="90"
                android:rowCount="3"
                android:layout_height="match_parent">


                <TextView
                    android:gravity="center_vertical|center_horizontal"
                    android:id="@+id/lesson_name"
                    android:text="Chemistry"
                    android:textSize="22dp"
                    android:layout_height="wrap_content"
                    android:layout_column="1"
                    android:layout_row="0"
                    android:layout_rowWeight="15"
                    android:layout_gravity="center_horizontal"
                    android:paddingTop="10dp"
                    android:layout_width="match_parent" />

                <TextView
                    android:gravity="bottom|center_horizontal"
                    android:id="@+id/teacher"
                    android:text="Mr Smith"
                    android:layout_height="wrap_content"
                    android:textSize="16dp"
                    android:layout_column="1"
                    android:layout_row="1"
                    android:layout_rowWeight="20"
                    android:layout_gravity="center_horizontal"
                    android:layout_width="match_parent" />


                <TextView
                    android:gravity="top|center_horizontal"
                    android:id="@+id/room"
                    android:text="Room A-123"
                    android:textSize="16dp"
                    android:layout_height="wrap_content"
                    android:layout_column="1"
                    android:layout_row="2"
                    android:layout_rowWeight="20"
                    android:layout_gravity="center_horizontal"
                    android:layout_width="match_parent" />


            </GridLayout>

            <View android:layout_row="0"
                android:layout_column="2"
                android:layout_height="match_parent"
                android:layout_width="0dp"
                android:layout_columnWeight="15">

            </View>

            <View android:layout_row="0"
                android:id="@+id/badge"
                android:layout_column="3"
                android:layout_height="match_parent"
                android:layout_width="0dp"
                android:background="#c0392b"
                android:layout_columnWeight="5">

            </View>


        </GridLayout>

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

</LinearLayout>

Preview Screenshot

Device Screenshot(不管操作栏或其他东西,它只是 CardView...)

// 更新:昨天将我的Android版本升级到6.0.0 Marshmallow,现在可以正常使用了。但是我包含了 AppCompat 的东西......它不能在早期版本的 Android 上运行的原因是什么?

【问题讨论】:

  • 您是否在任何其他设备或模拟器上检查过这个?
  • 在我的安卓 5.0.2 的三星平板电脑上出现同样的问题...

标签: android android-studio android-gridlayout


【解决方案1】:

没关系,这是版本错误:

经过一些测试后,我意识到我需要将布局文件中的&lt;GridLayout&gt; 更改为&lt;android.support.v7.widget.GridLayout&gt;。没想到,因为我认为 GridLayout 会与 Android 5 兼容...

所以现在它在我所有的设备上都可以正常工作,Android 5 和 Android 6 也是如此。 虽然对我帮助不大,但感谢您的快速回答!

【讨论】:

  • 这为我解决了问题 - 谢谢。但是,为了能够使用像app:columnCount="2" 这样的网格属性,我还需要设置这个:xmlns:app="http://schemas.android.com/apk/lib/android.support.v7.widget.GridLayout"
【解决方案2】:

android studio 中的预览有时会和你的设备不同,请确保你的手机和android studio 中的预览设置相同的屏幕尺寸

【讨论】:

  • 我不相信这是屏幕尺寸,因为我使用的是列和行的权重,所以它应该适合屏幕尺寸...
  • @seschi98 - 这不是引导程序 :)
  • @LinX64 是的,我知道,但我认为将 gridLayout 宽度设置为 match_parent(可以说是 100%)并在孩子身上定义权重可以让它有点响应
  • 尝试声明内边距和布局边距
【解决方案3】:

肯尼已经给你答案了。

有时预览显示良好,但在某些设备上看起来不同。这通常是由于屏幕尺寸和(或)您的屏幕分辨率造成的。

您可以为屏幕尺寸添加指定布局。但是您必须了解,android 可以在各种各样的设备和屏幕尺寸上运行。在某些屏幕上你总是会遇到麻烦,也许专注于小的设计问题不是要走的路。

检查此链接:

Android And Supporting Mutiple Screens Layouts

Screens distribution

编辑:

如果您在每台设备上都遇到相同的问题,那么这可能与我们已经告知的情况无关。让我再检查一下你的代码,然后再告诉你一些其他的事情。

【讨论】:

  • 但是我正在使用权重并且没有为宽度/高度设置任何静态值......我不明白为什么这很重要......
【解决方案4】:

对齐很重要,我也有同样的问题。我只设置了一个属性 paddingLeft 但在某些设备中它不起作用,所以我必须在样式中同时提供属性 paddingStart 和 paddingLeft -

<item name="android:paddingLeft">@dimen/drawable_icon_padding_left</item>
<item name="android:paddingStart">@dimen/drawable_icon_padding_left</item>

因此,请确保您在布局或样式中同时使用这两个属性。快乐编码:-)

【讨论】:

    猜你喜欢
    • 2015-09-26
    • 1970-01-01
    • 2015-08-11
    • 1970-01-01
    • 2015-12-21
    • 1970-01-01
    • 2012-09-20
    • 2011-09-09
    相关资源
    最近更新 更多