错误的重力应用于 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 那样工作
android中重力和layout_gravity的优先级是啥?