【0202】用户登陆系统 界面跳转 密码用户名校验 事件处理
运行效果如图所示。
一、涉及知识点
1、线性布局(LinearLayout)
2、标签(TextView)
3、编辑框(EditText)
4、按钮(Button)
5、安卓事件处理机制
6、土司(Toast)
7、意图(Intent)
(1)功能作用:联系安卓不同组件之间的一个重要桥梁。
(2)使用方式:显式使用方式(直接指定目标组件)和隐式使用方式(通过意图过滤器来筛选)
二、实现步骤
1、在上一次界面界面的基础上修改MainActivity名字为LoginActivity ,布局文件activity_main改为activity_login 如图所示:
2、使用模板创建新的活动 MainActivity 和 activity_main如图
3、activity_login.xml布局资源文件代码
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:gravity="center"
android:orientation="vertical"
android:background="@mipmap/timg"
tools:context="com.example.a15114.loginstusystem.LoginActivity">
<TextView
android:id="@+id/tv_user_login"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginBottom="30dp"
android:text="@string/user_login"
android:textColor="#ff0000"
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_user_name"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="@string/username"
android:textColor="#000000"
android:textSize="20sp" />
<EditText
android:id="@+id/edt_user_name"
android:layout_width="150dp"
android:layout_height="wrap_content"
android:ems="10"
android:hint="@string/input_user_name"
android:maxLines="1" />
</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/edt_password"
android:layout_width="150dp"
android:layout_height="wrap_content"
android:ems="10"
android:hint="@string/input_password"
android:inputType="textPassword"
android:maxLines="1" />
</LinearLayout>
<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginTop="30dip"
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="30dp"
android:paddingRight="30dp"
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="30dp"
android:paddingRight="30dp"
android:text="@string/cancel"
android:textSize="20sp" />
</LinearLayout>
</LinearLayout>
4、字符串strings.xml中代码
<resources>
<string name="app_name">用户登录</string>
<string name="action_settings">设置</string>
<string name="user_login">用户登录</string>
<string name="username">用户:</string>
<string name="password">密码:</string>
<string name="login">登录</string>
<string name="cancel">取消</string>
<string name="input_user_name">输入用户名</string>
<string name="input_password">输入密码</string>
<string name="title_activity_main">主窗口</string>
<string name="hello_world">Hello world!</string>
</resources>
5、在LoginActivity中声明变量,并获取用户输入的字符串,当按钮被按下时,响应事件处理。
package com.example.a15114.loginstusystem;
import android.app.Activity;
import android.content.Intent;
import android.os.Bundle;
import android.text.TextUtils;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;
import android.widget.EditText;
import android.widget.Toast;
import java.util.HashMap;
import java.util.Map;
public class LoginActivity extends Activity {
/**
* 用户名编辑框
*/
private EditText edtUserName;
/**
* 密码编辑框
*/
private EditText edtPassword;
/**
* 登录按钮
*/
private Button btnLogin;
/**
* 取消按钮
*/
private Button btnCancel;
Map<String,String> hashMap=new HashMap<String, String>();
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
// 利用布局资源文件设置用户界面
setContentView(R.layout.activity_login);
hashMap.put("admin","123");
hashMap.put("user","1234");
hashMap.put("student","12345");
hashMap.put("teacher","123456");
hashMap.put("user1","1");
// 通过资源索引获得界面控件实例
edtUserName = (EditText) findViewById(R.id.edt_user_name);
edtPassword = (EditText) findViewById(R.id.edt_password);
btnLogin = (Button) findViewById(R.id.btn_login);
btnCancel = (Button) findViewById(R.id.btn_cancel);
// 给登录按钮注册监听器,实现监听器接口,编写事件处理方法
btnLogin.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
// 保存用户输入的数据:用户名与密码
String strUserName = edtUserName.getText().toString().trim();
String strPassword = edtPassword.getText().toString().trim();
String str=new String();
str= hashMap.get(strUserName);
// 非空校验
if (TextUtils.isEmpty(edtUserName.getText()) || TextUtils.isEmpty(edtPassword.getText())) {
Toast.makeText(LoginActivity.this, "用户名和密码不能为空!", Toast.LENGTH_LONG).show();
return;
}
// 判断用户名与密码是否正确(假定用户名与密码都是“admin”)
if (strPassword.equals(str)) {
Toast.makeText(LoginActivity.this, "恭喜,用户名与密码正确!", Toast.LENGTH_LONG).show();
// 创建意图,参数1:上下文环境;参数2:目标窗口
Intent intent = new Intent(LoginActivity.this, MainActivity.class);
// 创建Bundle对象,用于封装数据(各种数据类型)
Bundle bundle = new Bundle();
bundle.putString("username", strUserName);
bundle.putString("password", strPassword);
// 利用意图来传递数据包
intent.putExtras(bundle);
// 按意图启动窗口
startActivity(intent);
} else {
int i=0;
for (String key : hashMap.keySet()) {
if (key.equals(strUserName)) {
Toast.makeText(LoginActivity.this, "密码错误", Toast.LENGTH_SHORT).show();
break;
}
i++;
}
if (i==hashMap.size()){
Toast.makeText(LoginActivity.this, "用户名错误", Toast.LENGTH_SHORT).show();
}
}
}
});
// 给取消按钮注册监听器,实现监听器接口,编写事件处理方法
btnCancel.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
finish();
}
});
}
}
5、MainActivity中的代码
package com.example.a15114.loginstusystem;
import android.app.Activity;
import android.content.Intent;
import android.os.Bundle;
import android.text.TextUtils;
import android.widget.TextView;
public class MainActivity extends Activity {
/**
* 显示用户信息的标签
*/
private TextView tvUserInfo;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
// 利用布局资源文件设置用户界面
setContentView(R.layout.activity_main);
// 利用资源索引获得界面控件实例
tvUserInfo = (TextView) findViewById(R.id.tv_user_info);
// 获取从起始窗口传递过来的意图
Intent intent = getIntent();
if (intent != null) {
// 获取意图中携带的数据包
Bundle data = intent.getExtras();
// 获取数据包里的每项数据(按键取值)
String strUserName = data.getString("username");
String strPassword = data.getString("password");
// 利用获得的数据更新用户信息标签
//tvUserInfo.setText("用户名:" + strUserName + "\n密 码:" + strPassword);
// 利用获得的数据更新用户信息标签
tvUserInfo.setText(String.format("用户名:%s\n密码:%s", strUserName, strPassword));
}
}
}
6、activity_main.xml中的代码
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:orientation="vertical"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:background="@mipmap/mainback"
android:padding="10dp">
<TextView
android:id="@+id/tv_user_info"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:textColor="#0000ff"
android:textSize="25sp" />
</LinearLayout>
7、在项目清单文件中加入红框中的代码
三、问题小结
1、跳转利用意图,显式使用方式,直接指定目标组件
2、数据传递问题
源组件(发送方):利用Bundle来封装多项数据(键值对的方式),然后利用intent的putExtras方法携带数据。
目标组件(接收方):
(1)利用getIntent()方法获得意图对象intent
(2)通过intent的getExtras()获得数据包data
(3)通过data的getXXX()方法按键取值