Android基础学习笔记7:事件处理、窗口跳转与传递数据

学习目标
会使用线性布局和三个基本控件设计用户界面
能说出安卓事件处理机制的实现步骤
能编写代码完成安卓应用的事件处理
会使用Intent控件实现窗口的跳转
会在不同的窗口之间传递数据(Bundle)

一、三个基本控件

1、标签控件(TextView)

类层次继承图
在这里插入图片描述

常用属性:text、textSize、textColor……

2、编辑框控件(EditText)

类层次继承图
在这里插入图片描述

常用属性:text、textSize、textColor、hint……

3、按钮控件(Button)

类层次继承图
在这里插入图片描述

常用属性:text、background、layout_width、layout_height……

二、安卓事件处理机制

(一)安卓事件处理概述

不论是桌面应用还是手机应用程序,需要对用户的动作提供响应,这种为用户动作提供响应的机制就是事件处理。
安卓提供了两种事件处理机制:基于回调的事件处理和基于监听的事件处理。
基于监听的事件处理是一种“面向对象”的事件处理,涉及三种对象:事件源(EventSource)、事件(Event)、事件监听器(EventListener)。
基于监听的事件处理流程图
在这里插入图片描述

(二)安卓事件处理步骤

以按钮单击事件处理为例说明安卓事件处理步骤
在界面类里声明按钮控件变量
通过findViewById()方法得到按钮实例
利用setOnClickListener()方法给按钮注册单击事件监听器
实现单击事件监听器接口,采用匿名实现方式
在接口的抽象方法里编写事件处理代码

三、案例演示:实现用户登录功能

《安卓学习笔记04》课后作业让大家做一个登录窗口,本案例对按钮进行事件处理,如果登录成功,弹出吐司提示用户登录成功,否则弹出吐司提示用户登录失败。

(一)运行效果

在这里插入图片描述

(二)涉及知识点

线性布局(LinearLayout)
标签(TextView)
编辑框(EditText)
按钮(Button)
安卓事件处理机制(Event Handling Mechanism)
吐司(Toast)

(三)实现步骤

1、创建安卓应用【UserLogin】

2、添加背景图片background.jpg

将背景图片background.jpg放在res/drawable目录
在这里插入图片描述

3、基于模板创建登录窗口LoginActivity

基于Empty Activity模板创建
在这里插入图片描述

在这里插入图片描述
在这里插入图片描述

4、登录窗口布局资源文件activity_login.xml

在这里插入图片描述

<?xml version="1.0" encoding="utf-8"?>

<TextView
    android:id="@+id/tvUserLogin"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:layout_marginBottom="30dp"
    android:text="@string/user_login"
    android:textColor="#ff00ff"
    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/tvUsername"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="@string/username"
        android:textColor="#000000"
        android:textSize="20sp" />

    <EditText
        android:id="@+id/edtUsername"
        android:layout_width="150dp"
        android:layout_height="wrap_content"
        android:ems="10"
        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/tvPassword"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="@string/password"
        android:textColor="#000000"
        android:textSize="20sp" />

    <EditText
        android:id="@+id/edtPassword"
        android:layout_width="150dp"
        android:layout_height="wrap_content"
        android:ems="10"
        android:hint="@string/input_password"
        android:inputType="textPassword"
        android:singleLine="true" />
</LinearLayout>

<LinearLayout
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:layout_marginTop="30dp"
    android:gravity="center_horizontal"
    android:orientation="horizontal" >

    <Button
        android:id="@+id/btnLogin"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:paddingLeft="30dp"
        android:paddingRight="30dp"
        android:text="@string/login"
        android:textSize="20sp" />

    <Button
        android:id="@+id/btnCancel"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:paddingLeft="30dp"
        android:paddingRight="30dp"
        android:text="@string/cancel"
        android:textSize="20sp" />
</LinearLayout>

gravity:用于设置容器的子控件的对齐方式,或控件的内容的对齐方式
orientation:线性布局的方向(horizontal——横向、vertical——纵向)
padding:内边距,用于设置子控件与父容器边框的距离,或控件的内容与控件边框的距离;(paddingLeft、paddingRight、paddingTop、paddingBottom)
layout_margin:外边距,用于设置控件之间的距离;(layout_marginLeft,layout_marginRight、layout_marginTop、layout_marginBottom)
hint:用于设置编辑框的提示内容,当编辑框为空时就显示出来,一旦有内容就立马消失。
singleLine:用于设置编辑框是否为单行输入,取值为“true”,那就是单行输入。
思考题:如何将按钮改成微信登录按钮的配色。
#04be02
在这里插入图片描述

#07bcfc
在这里插入图片描述

5、主窗口布局资源文件activity_main.xml

<?xml version="1.0" encoding="utf-8"?>

<TextView
    android:id="@+id/tvMessage"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:textSize="25dp"
    android:textColor="#0000ff"/>

6、项目清单文件AndroidManifest.xml

删除MainActivity元素的意图过滤器
在这里插入图片描述

7、字符串资源文件strings.xml

在这里插入图片描述

用户登录 用户登录 用户: 请输入用户名 密码: 请输入密码 登录 取消

8、登录窗口LoginActivity

在这里插入图片描述

(1)声明控件变量
在这里插入图片描述

(2)通过资源标识符获取控件实例
在这里插入图片描述

(3)登录按钮事件处理
给登录按钮注册监听器,实现监听器接口,并且编写事件处理代码
在这里插入图片描述

(4)取消按钮事件处理
给取消按钮注册监听器,实现监听器接口,并且编写事件处理代码
在这里插入图片描述

9、启动应用,查看效果

在这里插入图片描述

(1)输入用户名与密码正确的情况
在这里插入图片描述

(2)输入用户名或密码错误的情况

在这里插入图片描述

四、利用意图启动组件

(一)使用显式意图启动组件

假设有两个窗口:FirstActivity和SecondActivity
方式一
Intent intent = new Intent(FirstActivity.this, SecondActivity.class);
startActivity(intent);

方式二
Intent intent = new Intent();
intent.setClass(FirstActivity.this, SecondActivity.class);
startActivity(intent);

方式三
Intent intent = new Intent();
ComponentName component = new ComponentName(FirstActivity.this, SecondActivity.class);
intent.setComponent(component);
startActivity(intent);

(二)使用隐式意图启动组件

1、在Java代码创建隐式意图

Intent intent = new Intent();
intent.setAction(“net.hw.ACTION_NEXT”);
intent.addCategory(Intent.CATEGORY_DEFAULT);
startActivity(intent);

2、在项目清单文件里设置意图过滤器

五、利用意图传递数据

(一)传递单项数据

在起始组件通过意图传递单项数据
// 通过意图传递单项数据
intent.putExtra(“username”, strUsername);
intent.putExtra(“password”, strPassword);

在目标组件通过意图获取单项数据
// 通过意图获取单项数据
String username = intent.getStringExtra(“username”);
String password = intent.getStringExtra(“password”);

(二)传递数据包

1、在起始组件通过意图携带数据包

// 创建数据包,封装数据
Bundle data = new Bundle();
data.putString(“username”, strUsername);
data.putString(“password”, strPassword);
// 通过意图携带数据包
intent.putExtras(data);

2、在目标组件通过意图获取数据包

// 获取意图携带的数据包
Bundle data = intent.getExtras();
// 从数据包里按键取值获取各项数据
String username = data.getString(“username”);
String password = data.getString(“password”);

(三)传递实体对象

1、传递实现了Serializable接口的实体对象

参看【六、案例演示:修改用户登录程序】

2、传递实现了Parcelable接口的实体对

六、案例演示:修改用户登录程序

当登录成功,跳转到主窗口,显示用户名与密码。

(一)运行效果

在这里插入图片描述

(二)涉及知识点

线性布局(LinearLayout)
标签(TextView)
编辑框(EditText)
按钮(Button)
安卓事件处理机制
吐司(Toast)
意图(Intent)
(1)功能作用:联系安卓不同组件之间的一个重要桥梁
(2)使用方式:本案例采用显式意图启动组件方式实现窗口跳转

(三)实现步骤

1、修改登录界面LoginActivity

创建显式意图,利用意图携带数据,按照意图启动目标组件
在这里插入图片描述

2、修改主界面MainActivity

接收登录界面通过意图传递的数据并显示在标签里
在这里插入图片描述

3、启动应用,查看效果

在这里插入图片描述

(1)输入用户名与密码正确的情况
在这里插入图片描述
在这里插入图片描述

(2)输入用户名或密码错误的情况
在这里插入图片描述

4、修改登录界面LoginActivity

在这里插入图片描述

5、修改主界面MainActivity

在这里插入图片描述

6、启动应用,测试效果

在这里插入图片描述

7、创建用户实体类

创建用户实体类,实现Serializable接口
在这里插入图片描述

package net.hw.userlogin;

import java.io.Serializable;

/**

  • 功能:用户类

  • 作者:王凯

  • 日期:2020年09月17日
    */
    public class User implements Serializable {
    private String username;
    private String password;

    public User() {
    }

    public User(String username, String password) {
    this.username = username;
    this.password = password;
    }

    public String getUsername() {
    return username;
    }

    public void setUsername(String username) {
    this.username = username;
    }

    public String getPassword() {
    return password;
    }

    public void setPassword(String password) {
    this.password = password;
    }
    }

8、修改登录界面LoginActivity

在这里插入图片描述

9、修改主界面MainActivity

在这里插入图片描述

10、启动应用,测试效果

在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

土豆_wk

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值