相对布局(RelativeLayout)

本文介绍了Android中的Relative Layout,强调其通过layout_toLeftOf、layout_toRightOf等属性定义控件相对位置,以及layout_alignXXX对齐方式和layout_marginXXX设置间距的功能。使用RelativeLayout可以简化界面代码,避免过度嵌套,实现更灵活的界面设计。文中还提到可以通过代码实例或拖拽操作来创建相对布局。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

RelativeLayout中往往需要定义每一个控件的资源ID

layout_toLeftOf      layout_toRightOf    layout_below表示相对位置

layout_alignXXX表示对齐方式

layout_marginXXX表示间距

android:layout_centerInParent="true":将控件放置于父界面的中心位置

即子控件的位置可以取决于兄弟控件或者父控件的位置,与LinearLayout相比,减少嵌套使用,界面代码简洁.


实例代码 : (下列代码效果是由以中间的控件为参照物来定位的)

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent">
    <TextView
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="Java"
        android:layout_centerInParent="true"
        android:textSize="30sp"
        android:textColor="#F000"
        android:id="@+id/textView_center" />
    <TextView
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="左上"
        android:textSize="30sp"
        android:id="@+id/textView_left_top"
        android:layout_above="@+id/textView_center"
        android:layout_alignParentStart="true"
        android:layout_marginBottom="60dp"
        />
    <TextView
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="右上"
        android:textSize="30sp"
        android:id="@+id/textView_right_top"
        android:layout_alignTop="@+id/textView_left_top"
        android:layout_alignParentEnd="true" />
    <TextView
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="左下"
        android:textSize="30sp"
        android:id="@+id/textView_left_bottom"
        android:layout_below="@+id/textView_center"
        android:layout_alignParentStart="true"
        android:layout_marginTop="86dp" />

    <TextView
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="右下"
        android:textSize="30sp"
        android:id="@+id/textView_right_bottom"
        android:layout_alignTop="@+id/textView_left_bottom"
        android:layout_alignParentEnd="true" />
</RelativeLayout>

(2)也可以通过拖拽操作完成想要的效果

相对布局的属性:

android:layout_alignParentLeft="true"

android:layout_alignParentRight="true"

android:layout_alignParentBottom="true"

android:layout_alignParentTop="true"

与相对11111布局的对其方式

有四个方向

android:layout_alignBottom="@+id/button1"

android:layout_alignTop="@+id/button1"

android:layout_alignLeft="@+id/button1"

android:layout_alignRight="@+id/button1"

button1组件的对其方式
有四个方向

android:layout_toRightOf="@+id/button1"

android:layout_toLeftOf="@+id/button1"

android:layout_above="@+id/button1"

android:layout_below="@+id/button1"

button1组件的那个位置
有四个方向

android:layout_centerHorizontal="true"

android:layout_centerVertical="true"

android:layout_centerInParent="true"

在相对布局中的对其方式

android:layout_alignBaseline="@+id/button1"

组件的文字底部与button1的文字的底部对其

组件之间不能相互依赖,不然会出错

相对布局的实例

<1>前端设计

:

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"

    android:layout_width="match_parent"
    android:layout_height="match_parent"
  >

    <TextView
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:textSize="20sp"
        android:id="@+id/textView_userName"
        android:layout_alignParentTop="true"
        android:layout_alignParentStart="true"
        android:layout_marginTop="70dp"
        android:text="请输入用户名:" />
    <EditText
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:textSize="20sp"
        android:layout_toRightOf="@+id/textView_userName"
        android:layout_alignBottom="@+id/textView_userName"
        android:id="@+id/edit_userName"
        android:text="请输入用户名" />

        />
    <TextView
        android:id="@+id/textView_password"
        android:layout_height="wrap_content"
        android:layout_width="wrap_content"
        android:text="请输入    密码:"
        android:textSize="20sp"
        android:layout_below="@+id/textView_userName"
        android:layout_marginTop="50dp"

        />
    <EditText
        android:id="@+id/edit_password"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:text="请输入密码"
        android:textSize="20sp"
        android:layout_alignBottom="@+id/textView_password"
        android:layout_toRightOf="@+id/textView_password"
        />
    <Button
        android:id="@+id/button_login"
        android:layout_height="wrap_content"
        android:layout_width="wrap_content"
        android:text="登录"
        android:layout_centerVertical="true"
        android:layout_toStartOf="@+id/button_reset"
        android:textSize="20sp"
        />
    <Button
        android:id="@+id/button_reset"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_alignTop="@+id/button_login"
        android:layout_toEndOf="@+id/textView_password"
        android:layout_marginLeft="50dp"
        android:text="重置"
        android:textSize="20sp"
        />
</RelativeLayout>

<2>后台逻辑

package com.example.relativelayout_demo;

import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.text.TextUtils;
import android.view.View;
import android.widget.Button;
import android.widget.EditText;
import android.widget.Toast;

/**
 * 给按钮添加单击事件
 */
public class MainActivity extends AppCompatActivity {

    private EditText editText_userName;
    private EditText editText_userPassword;

    private Button button_login;
    private Button button_reset;



    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.relative_login);
        this.initView();
    }

    /**
     * 初始化控件
     */
    private void initView() {
        this.editText_userName = (EditText) this.findViewById(R.id.edit_userName);
        this.editText_userPassword = (EditText) this.findViewById(R.id.edit_password);
        this.button_login = (Button) this.findViewById(R.id.button_login);
        this.button_reset = (Button) this.findViewById(R.id.button_reset);

        this.button_login.setOnClickListener(new View.OnClickListener(){
            /**
             * 当用户点击登录按钮时自动调节的方法
             * @param v
             */
            @Override
            public void onClick(View v){
                //如何在内部类中访问外部类对象?类名.this
                String userName = MainActivity.this.editText_userName.getText().toString().trim();

                //判断用户名是否输入
                if(TextUtils.isEmpty(userName)){
                    editText_userName.setError("用户名必须输入");
                    editText_userName.requestFocus();
                    return;
                }
            editText_userPassword.requestFocus();
        /*
        "admin".equals(userName)和userName.equals("admin")有什么区别?
        使用equals时,必须考虑null(空值)的问题
        当userName = null
        (1)"admin"equals(null)   ==>false
        (2)null.equals("admin")  ==>抛空指针异常
        为什么会报空指针(NullPointerException)异常? 当对象没有赋值或者说值为null 时调用任何方法都是报空指针异常
        System.out.println(userName.equals("admin"));
        */
         if("admin".equals(userName)){
             /*
             如何在内部类中访问外部类的成员变量?
                   方式1:外部类对象.外部类成员变量
                   方式2:外部类成员变量
             */
             String pwd = editText_userPassword.getText().toString().trim();
             if(TextUtils.isEmpty(pwd)){
                 editText_userPassword.setError("密码必须输入");
                 editText_userPassword.requestFocus();
                 return;
             }
             //用户名正确
             if("123".equals(pwd)){
                 //密码正确
                 Toast.makeText(MainActivity.this, userName+"登录成功", Toast.LENGTH_SHORT).show();
             }else{
                 //密码错误
                 editText_userPassword.setText(null);
                 editText_userPassword.requestFocus();
                 Toast.makeText(MainActivity.this, "密码["+pwd+"]错误!", Toast.LENGTH_SHORT).show();
             }
         }else{
             //用户名错误
             editText_userName.setText(null);
             editText_userName.requestFocus();
             Toast.makeText(MainActivity.this, "用户名["+userName+"]错误!", Toast.LENGTH_SHORT).show();
                }
            }
        });
        this.button_reset = (Button) this.findViewById(R.id.button_reset);

        this.button_reset.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                editText_userName.setText(null);
                editText_userPassword.setText(null);
                editText_userName.requestFocus();
            }
        });



    }
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值