错误的重力应用于 LinearLayout 项目

Posted

技术标签:

【中文标题】错误的重力应用于 LinearLayout 项目【英文标题】:Wrong gravity applied to LinearLayout items 【发布时间】:2018-03-11 18:33:32 【问题描述】:

将 Gravity 属性应用于我的 XML 项目后,它们似乎没有放置在正确的位置。如何解决这些问题,以便满足以下条件?:

    “上移”按钮需要位于屏幕顶部 “下移”按钮需要位于屏幕底部 GridView 需要位于屏幕的垂直中心

activity_main.xml

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout
    xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_
    android:layout_
    android:orientation="vertical"
    tools:context=".MainActivity">
    <Button
        android:id="@+id/btn_moveup"
        android:text="move up"
        android:layout_
        android:layout_
        android:layout_gravity="top"
        />

    <GridView
        android:id="@+id/abslistview_main"
        android:layout_
        android:layout_
        android:layout_gravity="center_vertical"
        android:numColumns="auto_fit"
        />

    <Button
        android:id="@+id/btn_movedown"
        android:text="move down"
        android:layout_
        android:layout_
        android:layout_gravity="bottom"
        />
</LinearLayout>

更新(akshay_shahane 的建议)

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout
    xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_
    android:layout_
    android:layout_gravity="center_vertical"
    android:orientation="vertical"
    android:weightSum="100"
    tools:context=".MainActivity">
    <Button
        android:id="@+id/btn_moveup"
        android:text="move up"
        android:layout_
        android:layout_
        android:layout_weight="5"
        android:onClick="moveup_click"
        />

    <GridView
        android:id="@+id/abslistview_main"
        android:layout_
        android:layout_
        android:layout_weight="90"
        android:layout_gravity="center_vertical"
        android:numColumns="auto_fit"
        />

    <Button
        android:id="@+id/btn_movedown"
        android:text="move down"
        android:layout_
        android:layout_
        android:layout_weight="5"
        android:onClick="movedown_click"
        />
</LinearLayout>

【问题讨论】:

为什么不使用权重?向上移动 0.1,网格 0.8 和向下移动 0.1 @akshay_shahane 我做到了,但 GridView 的重要性不断提高!它不会到达垂直中心! 尝试将根布局重力设置为 centerVertical? 【参考方案1】:

试试这个

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout
    xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_
    android:layout_
    android:orientation="vertical"
    android:weightSum="1"
    tools:context=".MainActivity">
    <Button
        android:id="@+id/btn_moveup"
        android:text="move up"
        android:layout_weight="0.1"
        android:layout_
        android:layout_
        android:layout_gravity="top"
        />

    <GridView
        android:id="@+id/abslistview_main"
        android:layout_
        android:layout_weight="0.8"
        android:layout_
        android:layout_gravity="center_vertical"
        android:numColumns="auto_fit"
        />

    <Button
        android:id="@+id/btn_movedown"
        android:text="move down"
        android:layout_weight="0.1"
        android:layout_
        android:layout_
        android:layout_gravity="bottom"
        />
</LinearLayout>

【讨论】:

【参考方案2】:

像这样将GridLayout 的权重设置为1,将layout_height 的权重设置为0dp

<LinearLayout
    xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_
    android:layout_
    android:orientation="vertical"
    tools:context=".MainActivity">
    <Button
        android:id="@+id/btn_moveup"
        android:text="move up"
        android:layout_
        android:layout_ />

    <GridView
        android:id="@+id/abslistview_main"
        android:layout_
        android:layout_
        android:numColumns="auto_fit"
        android:layout_weight="1"
        />

    <Button
        android:id="@+id/btn_movedown"
        android:text="move down"
        android:layout_
        android:layout_
        />
</LinearLayout>

或者像这样将网格布局包装在另一个容器中。

<LinearLayout
    xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_
    android:layout_
    android:orientation="vertical"
    tools:context=".MainActivity">
    <Button
        android:id="@+id/btn_moveup"
        android:text="move up"
        android:layout_
        android:layout_ />

    <LinearLayout
        android:layout_
        android:layout_
        android:layout_weight="1">

        <GridView
            android:id="@+id/abslistview_main"
            android:layout_
            android:layout_
            android:layout_gravity="center"
            android:numColumns="auto_fit" />

    </LinearLayout>

    <Button
        android:id="@+id/btn_movedown"
        android:text="move down"
        android:layout_
        android:layout_
        />
</LinearLayout>

第二个选项会更好,因为它允许使用android:layout_gravity="center"GridLayout 居中。

【讨论】:

【参考方案3】:

只需要将gridview权重设置为1

<?xml version="1.0" encoding="utf-8"?>

<LinearLayout
xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_
android:layout_
android:orientation="vertical"
tools:context=".MainActivity">
<Button
    android:id="@+id/btn_moveup"
    android:text="move up"
    android:layout_
    android:layout_
    android:layout_gravity="top"
    />

<GridView
    android:id="@+id/abslistview_main"
    android:layout_
    android:layout_
    android:gravity="center_vertical"
    android:layout_weight="1"
    android:layout_gravity="center_vertical"
    android:numColumns="auto_fit"
    />
<Button
    android:id="@+id/btn_movedown"
    android:text="move down"
    android:layout_
    android:layout_
    android:layout_gravity="bottom"
    />
</LinearLayout>

【讨论】:

以上是关于错误的重力应用于 LinearLayout 项目的主要内容,如果未能解决你的问题,请参考以下文章

RelativeLayout 中的 Android 重力中心不像 LinearLayout 那样工作

TextView 重力属性不起作用

android中重力和layout_gravity的优先级是啥?

如果在 Kotlin 中未选择项目,如何更改文本视图的重力?

Spritekit - 将加速应用于物理主体

为孩子设置默认重力