Android Layout 之 RelativeLayout

卫衣 / 双肩包 / T 恤/羽绒服等任选,下单送 CSDN 年卡 程序员周边任选一款实物,直接赠送 CSDN 会员年卡+ Coding Plan,写代码学习装备一起拿下 立即抢购
Android Layout 之 RelativeLayout

  使用 AbsoluteLayout 可以直接指定其子 View  的绝对位置, 这种布局方式虽然简单,但是不够灵活。比如在一个程序中,按钮2 位于 按钮1 的下方且和 按钮1 左对齐,我们可以使用指定两个按钮的绝对位置的方式布局,但是当布局完成后,由于某些原因,这两个按钮需要相左平移一些距离以便在父 View 右边留出一些空白区域,那么我们就需要同时修改 按钮1 和 按钮2 的 layout params。如果布局更复杂一些呢?这样“牵一发而动全身”的布局模式恐怕不是那么友好吧?

  RelativeLayout,顾名思义,就是以“相对”位置/对齐 为基础的布局方式。android.widget.RelativeLayout 有个 继承自android.view.ViewGroup.LayoutParams 的内嵌类 LayoutParams,使用这个类的实例调用 RelativeLayout.addView 就可以实现“相对布局”。

  android.widget.RelativeLayout.LayoutParams 有一个构造函数:RelativeLayout.LayoutParams(int w, int h),参数指定了子 View 的宽度和高度,这一点和其父类是一样的。而实现相对布局的关键在它的 两个 addRule 方法上。anchor 参数指定可以是 View 的 id(“相对于谁”)、RelativeLayout.TRUE(启用某种对齐方式) 或者 是-1(应用于某些不需要 anchor 的 verb);AddRule 方法的 verb 参数指定相对的“动作”(以下常量均定义于 android.widget.RelativeLayout中,为了简便不给出其全名):

ALIGN_BOTTOM、ALIGN_LEFT、 ALIGN_RIGHT、 ALIGN_TOP: 本 View 的 底边/左边/右边/顶边 和 anchor 指定的 View 的 底边/左边/右边/顶边 对齐。
ALIGN_WITH_PARENT_BOTTOM 、ALIGN_WITH_PARENT_LEFT 、  ALIGN_WITH_PARENT_RIGHT 、 ALIGN_WITH_PARENT_TOP : 和上面一组常量类似,只不过不需要再指定 anchor, 其 anchor 自动为 Parent View。
CENTER_HORIZONTAL、CENTER_IN_PARENT 、CENTER_VERTICAL : 如果 anchor 为 TRUE,在 Parent 中 水平居中/水平和垂直均居中/垂直居中。
POSITION_ABOVE 、POSITION_BELOW 、 POSITION_TO_LEFT 、POSITION_TO_RIGHT  : 本 View  位于 anchor 指定的 View 的 上边/下边/左边/右边。

看一个例子:

package com.farproc.RLTest;

import android.app.Activity;
import android.os.Bundle;
import android.widget.*;
import android.view.*;

public class RLTest extends Activity {
   
    private RelativeLayout rl;
   
    private Button btn1;
    private Button btn2;
    private Button btn3;
    private Button btn4;
   
    private static final int ID_BTN1 = 1;
    private static final int ID_BTN2 = 2;
    private static final int ID_BTN3 = 3;
    private static final int ID_BTN4 = 4;
   
    /** Called when the activity is first created. */
    @Override
    public void onCreate(Bundle icicle) {
        super.onCreate(icicle);
       
        rl = new RelativeLayout(this);
       
        btn1 = new Button(this);
        btn1.setText("----------------------");
        btn1.setId(ID_BTN1);
        
        RelativeLayout.LayoutParams lp1 = new RelativeLayout.LayoutParams(ViewGroup.LayoutParams.WRAP_CONTENT, ViewGroup.LayoutParams.WRAP_CONTENT);
        lp1.addRule(RelativeLayout.ALIGN_WITH_PARENT_TOP);
        lp1.addRule(RelativeLayout.CENTER_HORIZONTAL, RelativeLayout.TRUE);
        // btn1 位于父 View 的顶部,在父 View 中水平居中
        rl.addView(btn1, lp1 );
       
        btn2 = new Button(this);
        btn2.setText("|/n|/n|/n|/n|/n|");
        btn2.setId(ID_BTN2);
       
        RelativeLayout.LayoutParams lp2 = new RelativeLayout.LayoutParams(ViewGroup.LayoutParams.WRAP_CONTENT, ViewGroup.LayoutParams.WRAP_CONTENT);
        lp2.addRule(RelativeLayout.POSITION_BELOW, ID_BTN1);
        lp2.addRule(RelativeLayout.ALIGN_LEFT, ID_BTN1);
        // btn2 位于 btn1 的下方、其左边和 btn1 的左边对齐
        rl.addView(btn2, lp2);
       
        btn3 = new Button(this);
        btn3.setText("|/n|/n|/n|/n|/n|");
        btn3.setId(ID_BTN3);
       
        RelativeLayout.LayoutParams lp3 = new RelativeLayout.LayoutParams(ViewGroup.LayoutParams.WRAP_CONTENT, ViewGroup.LayoutParams.WRAP_CONTENT);
       lp3.addRule(RelativeLayout.POSITION_BELOW, ID_BTN1);
        lp3.addRule(RelativeLayout.POSITION_TO_RIGHT, ID_BTN2);
        lp3.addRule(RelativeLayout.ALIGN_RIGHT, ID_BTN1);
        // btn3 位于 btn1 的下方、btn2 的右方且其右边和 btn1 的右边对齐(要扩充)
        rl.addView(btn3,lp3);
       
        btn4 = new Button(this);
        btn4.setText("--------------------------------------------");
        btn4.setId(ID_BTN4);
       
        RelativeLayout.LayoutParams lp4 = new RelativeLayout.LayoutParams(ViewGroup.LayoutParams.WRAP_CONTENT, ViewGroup.LayoutParams.WRAP_CONTENT);
        lp4.addRule(RelativeLayout.POSITION_BELOW, ID_BTN2);
        lp4.addRule(RelativeLayout.CENTER_HORIZONTAL, RelativeLayout.TRUE);
        // btn4 位于 btn2 的下方,在父 Veiw 中水平居中
        rl.addView(btn4,lp4);
       
       
        setContentView(rl);
    }
}

其效果如下:

 
Android入门教程 | UI布局之RelativeLayout 相对布局 RelativeLayout 属性RelativeLayout 可以指定子视图相对于父视图或彼此(由 ID 确定)的位置。因此,可以按照右边框对齐两个元素,或者使它们一上一下,屏幕居中,左侧居中,等等。默认情况下,所有子视图均绘制在布局的左上角,因此必须使用 RelativeLayout.LayoutParams 中提供的各种布局属性定义每个视图的位置。如果为 “true”,会将此视图的上边缘与父视图的上边缘对齐。如果为 “true”,会将此子级在父级内垂直居中。 阅读详情

相关推荐

RelativeLayout的addRule

RelativeLayout,顾名思义,就是以“相对”位置/对齐 为基础的布局方式。android.widget.RelativeLayout 有个 继承自android.view.ViewGroup.LayoutParams 的内嵌类 LayoutParams,使用这个类的实例调用 RelativeLayout.addView 就可以实现“相对布局”。   android.widget.Rela

Android小菜比的博客 4096

RelativeLayout 对齐属性

android:layout_alignBaseline 将该控件的baseline与给定ID的baseline对齐; android:layout_alignTop 将该控件的顶部边缘与给定ID的顶部边缘对齐; android:layout_alignBottom 将该控件的底部边缘与给定ID的底部边缘对齐; android:layout_alignLeft 将该控件的左边缘与给定ID的左边缘对...

灬灬的专栏 2757

android相对控件居中对齐,相对布局(RelativeLayout)常用属性

RelativeLayout子控件的一些属性://相对于同级控件对齐方式android:layout_alignBaseline将该控件的baseline与给定ID的baseline对齐;android:layout_alignTop 将该控件的顶部边缘与给定ID的顶部边缘对齐;android:layout_alignBottom 将该控件的底部边缘与给定...

weixin_33515785的博客 9361

android 在底部对齐,如何在Android的屏幕底部对齐addContentView

解决方案是将自定义视图包装在填充整个屏幕的RelativeLayout中,然后使用addContentView添加它.例如,要在屏幕底部添加自定义按钮:// Fake empty container layoutRelativeLayout lContainerLayout = new RelativeLayout(this);lContainerLayout.setLayoutParams(ne...

weixin_31138555的博客 391

完美解决安卓RelativeLayoutandroid:layout_marginRight不生效

欢迎访问我的个人网站:https://www.cjluzzl.cn 今天遇到了在RelativeLayoutlayout_marginRight不生效的问题,我是想在标题栏的右侧加一个ImageButton,但是layout_marginRight始终不生效,不管我怎么调节,这个按钮始终都在左边,如图 最后的解决办法是在ImageButton中加了一个属性 android:la

AllenRen的博客 5027

android 没有 layout_above,在RelativeLayout布局中layout_above不起作用

布局文件代码如下:layout_above没有起作用,listview把textview覆盖了<?xml version="1.0" encoding="utf-8"?><RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"android:layout_width="match_pare...

weixin_32279911的博客 1001

[Android]RelativeLayout中最底的View其layout_marginBottom无效

处理一个Dialog,发现RelativeLayout布局下最后一个View的layout_marginBottom会失效. 效果图见: 解决方法为: 在最底或最右的组件后面再加个View吧... 这个现象挺特别的,发帖记录一下。 xml布局如下: <RelativeLayout xmlns:android="http://schemas.android.com/apk/

Sodino的专栏 1万+

androidlayout_alignleft layout_toleftof区别,详解RelativeLayout布局属性

转载请注明博客地址。 最近看博客看到有关于RelativeLayout布局的解释,有的解释很多是错误的。因此有必要对每一个常见的布局属性进行描述。以下解释全部都是逐行进行测试的。 首先把常用的布局分组。(会对所有的对其方式解释,且主要讨论layout_alignleft layout_toleftof区别) android:layout_above

态度决定高度A=X+Y+Z 2万+

listView 中relativeLayout 布局的 android layout alignParentBotto

listView 中relativeLayout 布局的 android layout alignParentBotto

gruhgd的博客 264

关于AndroidRelativeLayout下面的三个属性:layout_centerVertical,layout_centerInParent,layout_centerHorizontal

今天在看网上的大神写的xinla

awy1988的专栏 2万+

android:layout_below,Layout_below在RelativeLayout中不起作用

我对Android开发很新颖。我在使用下面的RelativeLayout。我希望我的txtView1在lstAnswers之上,但layout_below不起作用并且视图覆盖。Layout_below在RelativeLayout中不起作用xmlns:tools="http://schemas.android.com/tools"android:layout_width="match_parent...

weixin_33954874的博客 770

个人经验 - AndroidRelativeLayout布局的layout_height属性设置为wrap_content时的坑

AndroidRelativeLayout布局的layout_height属性设置为wrap_content时的坑: 此坑出现的条件: 1.RelativeLayout布局的layout_height属性设置为wrap_content 2.某“居中View”设置为layout_centerX(layout_centerVertical、layout_centerHorizontal、lay...

weixin_30861459的博客 660

android 没有 layout_above,android,layout_above_在RelativeLayout布局中layout_above不起作用,android,layout_above...

RelativeLayout布局中layout_above不起作用布局文件代码如下:layout_above没有起作用,listview把textview覆盖了android:layout_width="match_parent"android:layout_height="match_parent" >android:id="@+id/listView2"android:layout_w...

weixin_39648539的博客 486

android RelativeLayoutandroid:layout_marginBottom的不起作用问题

RelativeLayout布局中: 1、当设置为android:layout_height="wrap_content"时,最下面的控件layout_marginBottom属性无效,如果其他控件使用layout_above让自己处于最下面的控件之上,那么layout_marginBottom属性有效。 2、当设置为android:layout_height="match

gjd1988的专栏 1504

Android RelativeLayout 布局android:layout_centerHorizontal="true"注意

特别注意,如果要是 android:layout_alignTop="@id/bind_decode_item_layout" android:layout_centerHorizontal="true" 生效必须要设置兄弟元素android:layout_centerInParent="true" <?xml version="1.0" encoding="utf-8"...

weixin_30692143的博客 317
上一篇: Android UI Layout 之 AbsoluteLayout
下一篇: Eclipse 快捷键的导出和导入
Android_G
博客等级 码龄19年 1粉丝 4原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值