android 有多种布局方式。
线性布局(LinearLayout),组件一个跟着一个,或者纵向排列、或者横向排列。这取决于 android:orientation 的设置。
android:orientation="vertical" 是纵向排列
android:orientation="horizontal" 是横向排列
<?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:layout_height="match_parent"
android:orientation="vertical"
tools:context="com.cofox.mykt.myweather.LayoutLinearActivity">
<TextView
android:id="@+id/textView"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="这里是线性布局LinearLayout" />
<Button
android:id="@+id/btnClose"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="关闭此界面" />
<Button
android:id="@+id/btnClose1"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="关闭此界面1" />
<Button
android:id="@+id/btnClose2"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="right"
android:text="关闭此界面2" />
<Button
android:id="@+id/btnClose3"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="center_horizontal"
android:text="取得页面内容" />
<WebView
android:id="@+id/myview"
android:layout_width="match_parent"
android:layout_height="match_parent" />
</LinearLayout>
相对布局(RelativeLayout),顾名思义每个控件都有自己定位的一个基点,根据基点确定自己相对于这个基点的存在位置。
这个几点可以是某个控件,也可以是活动的边沿。
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout 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:layout_height="match_parent"
tools:context="com.cofox.mykt.myweather.LayoutRelativeActivity">
<Button
android:id="@+id/btnRelativeButton1"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_alignParentLeft="true"
android:layout_alignParentTop="true"
android:text="Button" />
<Button
android:id="@+id/btnRelativeButton2"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_alignParentRight="true"
android:layout_alignParentTop="true"
android:text="Button" />
<Button
android:id="@+id/btnRelativeButton3"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_centerInParent="true"
android:text="Button" />
<Button
android:id="@+id/btnRelativeButton4"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_alignParentBottom="true"
android:layout_alignParentLeft="true"
android:text="Button" />
<Button
android:id="@+id/btnRelativeButton5"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_alignParentBottom="true"
android:layout_alignParentRight="true"
android:text="Button" />
</RelativeLayout>
上面的代码是直接按照控件的父类边框进行定位。
再看一下根据控件定位的代码。
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout 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:layout_height="match_parent"
tools:context="com.cofox.mykt.myweather.LayoutRelativeActivity">
<Button
android:id="@+id/btnRelativeButton1"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_centerInParent="true"
android:text="Button1" />
<Button
android:id="@+id/btnRelativeButton2"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_above="@id/btnRelativeButton1"
android:layout_toLeftOf="@id/btnRelativeButton1"
android:text="Button2" />
<Button
android:id="@+id/btnRelativeButton3"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_above="@id/btnRelativeButton1"
android:layout_toRightOf="@id/btnRelativeButton1"
android:text="Button3" />
<Button
android:id="@+id/btnRelativeButton4"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_below="@id/btnRelativeButton1"
android:layout_toLeftOf="@id/btnRelativeButton1"
android:text="Button5" />
<Button
android:id="@+id/btnRelativeButton5"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_below="@id/btnRelativeButton1"
android:layout_toRightOf="@id/btnRelativeButton1"
android:text="Button5" />
</RelativeLayout>
这里的Button都是根据Button1定位的。而Button1是根据父控件定位的。
当然如果仅仅是这样,那就太呆板了。下面让控件一个跟着一个定位。每个都以上一个控件为基点。
这样,如果移动被作为基点的控件的话,其他控件也会相应的移动位置。
先看代码
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout 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:layout_height="match_parent"
tools:context="com.cofox.mykt.myweather.LayoutRelativeActivity">
<Button
android:id="@+id/button1"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_alignParentStart="true"
android:layout_alignParentTop="true"
android:layout_marginStart="58dp"
android:layout_marginTop="68dp"
android:text="基点" />
<Button
android:id="@+id/button2"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_alignStart="@+id/button1"
android:layout_below="@+id/button1"
android:layout_marginTop="33dp"
android:text="Button2" />
<Button
android:id="@+id/button3"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_alignTop="@+id/button1"
android:layout_marginStart="43dp"
android:layout_toEndOf="@+id/button1"
android:text="Button3" />
<Button
android:id="@+id/button4"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_alignStart="@+id/button3"
android:layout_below="@+id/button2"
android:layout_marginTop="72dp"
android:text="Button4" />
</RelativeLayout>
这段代码要复杂一些。每个控件的定位要先找到Start相关的标签,
android:layout_alignParentStart="true"
android:layout_alignStart="@+id/button1"
android:layout_marginStart="43dp"
这个确定了控件的左边起点。
再确定Top
android:layout_alignParentTop="true"
android:layout_alignTop="@+id/button1"
android:layout_marginTop="33dp"
还需要确定的是当前控件的基点。
android:layout_below="@+id/button1"
android:layout_below="@+id/button2"
而第一个控件的基点, 依靠父控件来定位。
android:layout_marginStart="58dp"
android:layout_marginTop="68dp"
帧布局(FrameLayout),采用层叠布局的方式,所有的组件会压在前面放置的组件上面,如果了解photoshop的图层就更容易理解这种布局了。
为了理解这种布局,这里用三个控件来表现。
<?xml version="1.0" encoding="utf-8"?>
<FrameLayout 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:layout_height="match_parent"
tools:context="com.cofox.mykt.myweather.LayoutFrameActivity">
<EditText
android:id="@+id/editText"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:ems="10"
android:inputType="textPersonName"
android:text="Name"
tools:layout_editor_absoluteX="70dp"
tools:layout_editor_absoluteY="16dp" />
<ImageView
android:id="@+id/imageView"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginTop="2dp"
android:layout_marginLeft="62dp"
app:srcCompat="@mipmap/ic_launcher" />
<TextView
android:id="@+id/textView2"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginTop="75dp"
android:layout_marginLeft="72dp"
android:text="我的图片" />
</FrameLayout>
可以看到图片是压在输入框的上面的。
如果想调整这些组件的位置,就需要设置
android:layout_marginTop
android:layout_marginLeft
如果想调整上下遮盖的顺序,则需要调整活动的xml界面文件。最先出现的组件是在最下面的。这里试着交换一下 EditText 和 ImageView 的代码位置。
<?xml version="1.0" encoding="utf-8"?>
<FrameLayout 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:layout_height="match_parent"
tools:context="com.cofox.mykt.myweather.LayoutFrameActivity">
<ImageView
android:id="@+id/imageView"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginTop="2dp"
android:layout_marginLeft="62dp"
app:srcCompat="@mipmap/ic_launcher" />
<EditText
android:id="@+id/editText"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:ems="10"
android:inputType="textPersonName"
android:text="Name"
tools:layout_editor_absoluteX="70dp"
tools:layout_editor_absoluteY="16dp" />
<TextView
android:id="@+id/textView2"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginTop="75dp"
android:layout_marginLeft="72dp"
android:text="我的图片" />
</FrameLayout>
界面就变成了
这里就可以看到,输入框压在了图片上面。
而图片和文字“我的图片”的位置,是由各自的 marginTop 和 marginLeft 实现的控制。
当然,也可以使用 layout_gravity,这个方法尤其适合设置到右侧和底部等位置。
<ImageView
android:id="@+id/imageView"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginTop="2dp"
android:layout_gravity="right"
app:srcCompat="@mipmap/ic_launcher" />
百分比布局(PercentFrameLayout、PercentRelativeLayout),由于百分比布局不属于标准布局,所以需要在 app/build.gradle 的 dependencies 内添加百分比布局依赖 implementation 'com.android.support:percent:26.1.0'
在布局文件中,添加四个 button 组件
PercentFrameLayout
<?xml version="1.0" encoding="utf-8"?>
<android.support.percent.PercentFrameLayout 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:layout_height="match_parent"
tools:context="com.cofox.mykt.myweather.LayoutPercentFrameActivity">
<Button
android:id="@+id/button1"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="left|top"
android:text="Button1"
app:layout_widthPercent="50%"
app:layout_heightPercent="50%"/>
<Button
android:id="@+id/button2"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="right|top"
android:text="Button2"
app:layout_widthPercent="50%"
app:layout_heightPercent="50%"/>
<Button
android:id="@+id/button3"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="left|bottom"
android:text="Button3"
app:layout_widthPercent="50%"
app:layout_heightPercent="50%"/>
<Button
android:id="@+id/button4"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="right|bottom"
android:text="Button4"
app:layout_widthPercent="50%"
app:layout_heightPercent="50%"/>
</android.support.percent.PercentFrameLayout>
这些按钮的宽高
app:layout_widthPercent
app:layout_heightPercent
由此得出如下界面
PercentRelativeLayout
<?xml version="1.0" encoding="utf-8"?>
<android.support.percent.PercentRelativeLayout 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:layout_height="match_parent"
tools:context="com.cofox.mykt.myweather.LayoutPercentRelativeActivity">
<Button
android:id="@+id/button1"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="Button1"
app:layout_widthPercent="50%"
app:layout_heightPercent="50%"/>
<Button
android:id="@+id/button2"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="Button2"
android:layout_below="@id/button1"
app:layout_widthPercent="50%"
app:layout_heightPercent="50%"/>
<Button
android:id="@+id/button3"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="Button3"
android:layout_toEndOf="@id/button1"
app:layout_widthPercent="50%"
app:layout_heightPercent="50%"/>
<Button
android:id="@+id/button4"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="Button4"
android:layout_alignTop="@id/button2"
android:layout_toEndOf="@id/button2"
app:layout_widthPercent="50%"
app:layout_heightPercent="50%"/>
</android.support.percent.PercentRelativeLayout>
作为百分比相对布局,自然是要用到 layout_below、layout_toEndOf、layout_alignTop、等属性。