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();
}
});
}
}