文章目录
- 一、目标
- 二、课程记录
- (一)三个基本控件的类层次继承图及其常用属性
- 3.标签控件(TextView)
- 2.编辑框控件(EditText)
- 4.控件常用属性
- (二)安卓事件处理机制
- 1. 概述
- (三)案例:实现用户登录
- 1、创建项目
- 2、字符串资源文件
- 3、基于模板创建登录窗口
- 4、打开登陆窗口布局文件
- 5、主窗口布局资源文件
- 6、安卓项目清单文件
- 8、登录窗口功能实现
- (1)声明控件变量
- (2)获取控件实例
- (3)登录按钮事件处理
- (4)取消按钮事件处理
- (5)启动应用,查看效果
- (6)优化用户登录界面
- (四) 修改登录窗口代码(LoginActivity.java)
- (五)修改著串口代码(MainActivity.java)
一、目标
- 了解基本控件
- 理解安卓事件处理机制
- 使用意图启动组件
- 掌握窗口跳转与传递数据
二、课程记录
(一)三个基本控件的类层次继承图及其常用属性
- 选中控件名(如
TexView
)再按住 "CTRL + H "组合键 即可查看其类层次继承图。
3.标签控件(TextView)
2.编辑框控件(EditText)
4.控件常用属性
属性 | 含义 | 控件 |
text | 文本内容 | TextView,EditText,Button |
textSize | 文本字号,单位:sp | TextView,EditText,Button |
textColor | 文本颜色,(#00ff00 - 绿色) | TextView,EditText,Button |
hint | 提示信息 | EditText |
singleLine | 单行(true or false) | EditText |
inputType | 输入类型(普通文本、密码、邮件……) | EditText |
background | 背景颜色或背景图片 | Button |
layout_height | 高度,单位:dp (wrap_content, match_parent) | TextView,EditText,Button |
layout_weight | 宽度,单位:dp (wrap_content, match_parent) | TextView,EditText,Button |
(二)安卓事件处理机制
1. 概述
- 程序为用户动作提供响应的机制就是事件处理。
- 安卓提供了两种事件处理机制:基于回调的事件处理和基于监听的事件处理
- 基于监听的事件处理是一种“面向对象”的事件处理,涉及三种对象:事件源(
EventSource
)、事件(Event
)、事件监听器(EventListener
)
(三)案例:实现用户登录
1、创建项目
- 基于
Empty Activity
创建一个项目 - 配置项目基本信息
- 准备一张背景图片(
background.png)
拷贝到drawable
目录中
2、字符串资源文件
- 在字符串资源文件
strings.xml
里定义字符串变量
<resources>
<string name="app_name">用户登录</string>
<string name="user_login">用户登录</string>
<string name="username">用户:</string>
<string name="input_username">请输入用户名</string>
<string name="password">密码:</string>
<string name="input_password">请输入密码</string>
<string name="login">登录</string>
<string name="cancel">取消</string>
</resources>
3、基于模板创建登录窗口
- 在
layout
目录中,基于Empty Activity
模板创建LoginActivity
4、打开登陆窗口布局文件
activity_login.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_width="match_parent"
android:layout_height="match_parent"
android:background="@drawable/background"
android:gravity="center"
android:orientation="vertical"
android:padding="15dp"
tools:context=".LoginActivity">
<TextView
android:id="@+id/tv_user_login"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="@string/user_login"
android:textColor="#0000ff"
android:textSize="25sp"/>
<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:gravity="center_horizontal"
android:orientation="horizontal">
<TextView
android:id="@+id/tv_username"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="@string/username"
android:textColor="#000000"
android:textSize="20sp" />
<EditText
android:id="@+id/et_username"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:hint="@string/input_username"
android:singleLine="true" />
</LinearLayout>
<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:gravity="center_horizontal"
android:orientation="horizontal">
<TextView
android:id="@+id/tv_password"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="@string/password"
android:textColor="#000000"
android:textSize="20sp" />
<EditText
android:id="@+id/et_password"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:hint="@string/input_password"
android:inputType="textPassword"
android:singleLine="true" />
</LinearLayout>
<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:gravity="center_horizontal"
android:orientation="horizontal">
<Button
android:id="@+id/btn_login"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:paddingLeft="20dp"
android:paddingRight="20dp"
android:text="@string/login"
android:textSize="20sp"/>
<Button
android:id="@+id/btn_cancel"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:paddingLeft="20dp"
android:paddingRight="20dp"
android:text="@string/cancel"
android:textSize="20sp"/>
</LinearLayout>
</LinearLayout>
5、主窗口布局资源文件
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_width="match_parent"
android:layout_height="match_parent"
android:gravity="center"
tools:context=".MainActivity">
<TextView
android:id="@+id/tv_message"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:textSize="25dp"
android:textColor="#ff00ff"/>
</LinearLayout>
6、安卓项目清单文件
- 打开安卓项目清单文件
AndroidManifest.xml
, - 删除
MainAcivity
元素包含的意图过滤器
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
package="net.hxl.example.userlogin">
<application
android:allowBackup="true"
android:dataExtractionRules="@xml/data_extraction_rules"
android:fullBackupContent="@xml/backup_rules"
android:icon="@mipmap/ic_launcher"
android:label="@string/app_name"
android:roundIcon="@mipmap/ic_launcher_round"
android:supportsRtl="true"
android:theme="@style/Theme.UserLogin"
tools:targetApi="31">
<activity
android:name=".LoginActivity"
android:exported="true">
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
<activity
android:name=".MainActivity"
android:exported="true">
</activity>
</application>
</manifest>
8、登录窗口功能实现
LoginActivity
(1)声明控件变量
- 定义两个编辑框变量和两个按钮变量
(2)获取控件实例
- 通过
findViewById()
方法获取控件实例
(3)登录按钮事件处理
- 给登录按钮注册单击监听器,实现监听器接口
- 编写事件处理代码
- 获取用户输入的用户名和密码
- 判断是否正确,弹出不同的吐司
(4)取消按钮事件处理
package net.hxl.example.userlogin;
import androidx.appcompat.app.AppCompatActivity;
import android.content.Intent;
import android.os.Bundle;
import android.view.View;
import android.widget.Button;
import android.widget.EditText;
import android.widget.Toast;
public class LoginActivity extends AppCompatActivity {
private EditText etUsername;
private EditText etPassword;
private Button btnLogin;
private Button btnCancel;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
// 利用布局资源文件设置用户界面
setContentView(R.layout.activity_login);
// 通过资源标识符(id)获取控件实例
etUsername = findViewById(R.id.et_username);
etPassword = findViewById(R.id.et_password);
btnLogin = findViewById(R.id.btn_login);
btnCancel = findViewById(R.id.btn_cancel);
// 为登录按钮注册单价监听器
btnLogin.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
// 获取两个编辑的数据(trim():去除字符串前后的空格)
String strUsername = etUsername.getText().toString().trim();
String strPassword = etPassword.getText().toString().trim();
// 判断用户与密码是否正确
if (strUsername.equals("hxl") && strPassword.equals("123456")){
//三个参数:参数1-上下问:参数2:土司内容(字符串):参数3:土司持续时间
Toast.makeText(LoginActivity.this,"恭喜,用户名和密码正确!",Toast.LENGTH_SHORT).show();
} else {
Toast.makeText(LoginActivity.this,"遗憾,用户名和密码错误!",Toast.LENGTH_SHORT).show();
}
}
});
// 给取消按钮注册单击监听器
btnCancel.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
//关闭当前窗口
finish();
}
});
}
}
(5)启动应用,查看效果
- 输入正确用户名与密码
- 输入错误的用户名或密码
(6)优化用户登录界面
- 指定两个编辑框的宽度
- 按钮间隔
- 最终效果
(四) 修改登录窗口代码(LoginActivity.java)
- 创建意图,通过意图携带数据(打包数据)
package net.hxl.example.userlogin;
import androidx.appcompat.app.AppCompatActivity;
import android.content.Intent;
import android.os.Bundle;
import android.view.View;
import android.widget.Button;
import android.widget.EditText;
import android.widget.Toast;
public class LoginActivity extends AppCompatActivity {
private EditText etUsername;
private EditText etPassword;
private Button btnLogin;
private Button btnCancel;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
// 利用布局资源文件设置用户界面
setContentView(R.layout.activity_login);
// 通过资源标识符(id)获取控件实例
etUsername = findViewById(R.id.et_username);
etPassword = findViewById(R.id.et_password);
btnLogin = findViewById(R.id.btn_login);
btnCancel = findViewById(R.id.btn_cancel);
// 为登录按钮注册单价监听器
btnLogin.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
// 获取两个编辑的数据(trim():去除字符串前后的空格)
String strUsername = etUsername.getText().toString().trim();
String strPassword = etPassword.getText().toString().trim();
// 判断用户与密码是否正确
if (strUsername.equals("hxl") && strPassword.equals("123456")){
// 三个参数:参数1-上下问;参数2-土司内容(字符串);参数3-土司持续时间
Toast.makeText(LoginActivity.this,"恭喜,用户名和密码正确!",Toast.LENGTH_SHORT).show();
// 创建显示意图(参数1-包上下文:参数2-目标组件)
Intent intent = new Intent(LoginActivity.this,MainActivity.class);
// 通过意图携带数据
intent.putExtra("username", strUsername);
intent.putExtra("password", strPassword);
// 按照意图启动目标组件
startActivity(intent);
} else {
Toast.makeText(LoginActivity.this,"很遗憾,用户名和密码错误!",Toast.LENGTH_SHORT).show();
}
}
});
// 给取消按钮注册单击监听器
btnCancel.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
//关闭当前窗口
finish();
}
});
}
}
(五)修改著串口代码(MainActivity.java)
- 通过意图携带的数据包,拼接数据并显示
package net.hxl.example.userlogin;
import androidx.appcompat.app.AppCompatActivity;
import android.content.Intent;
import android.os.Bundle;
import android.widget.TextView;
public class MainActivity extends AppCompatActivity {
private TextView tvMessage;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
//利用布局资源文件设置用户界面
setContentView(R.layout.activity_main);
//通过资源标识符获取控件实例
tvMessage = findViewById(R.id.tv_message);
//获取意图
Intent intent = getIntent();
//判断意图是否为空
if (intent != null) {
// 获取意图携带的数据
Bundle data = intent.getExtras();
//从数据包里按键取值获取各项数据
String username = data.getString("username");
String password = data.getString("password");
// 拼接用户信息
String message = "您登录成功!\n用户:" + username + "\n密码:" + password;
// 设置标签属性,显示用户信息
tvMessage.setText(message);
}
}
}
- 重启应用,查看效果
- 录屏