1 实验名称
注册案例
2 实验目的
掌握多个Activity的实现方法,Activity之间数据的交互实现,Intent对象的使用
3 实验源代码
布局文件代码:
(1)activity_choose_city.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:id="@+id/main"
android:layout_width="match_parent"
android:layout_height="match_parent"
tools:context=".ChooseCityActivity">
<ExpandableListView
android:id="@+id/chooseCityELV"
android:layout_width="match_parent"
android:layout_height="wrap_content"
/>
</LinearLayout>
(2)activity_main.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:id="@+id/main"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical"
tools:context=".MainActivity">
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="欢迎注册Android资源网"
android:layout_gravity="center_horizontal"
android:textSize="36sp"
android:textColor="#00ff00"
/>
<TableLayout
android:layout_width="match_parent"
android:layout_height="wrap_content">
<TableRow>
<TextView
android:text="账号"
android:textSize="24sp"
android:layout_marginRight="30dp"
/>
<EditText
android:id="@+id/userNameET"
android:layout_width="300dp"
android:hint="用户名不能为空"
/>
</TableRow>
<TableRow>
<TextView
android:text="密码"
android:textSize="24sp"
android:layout_marginRight="30dp"
/>
<EditText
android:id="@+id/userPwdET"
android:layout_width="300dp"
android:hint="6-15位之间" />
</TableRow>
<TableRow>
<TextView
android:text="确认密码"
android:textSize="24sp"
android:layout_marginRight="30dp"
/>
<EditText
android:id="@+id/confirmPwdET"
android:layout_width="300dp"
android:hint="两次密码必须一致" />
</TableRow>
<TableRow>
<TextView
android:text="性别"
android:textSize="24sp"
android:layout_marginRight="30dp"
/>
<RadioGroup
android:orientation="horizontal"
>
<RadioButton
android:id="@+id/maleRBtn"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="男"
android:checked="true"
/>
<RadioButton
android:id="@+id/femaleRBtn"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="女"
/>
</RadioGroup>
</TableRow>
<TableRow>
<Button
android:id="@+id/cityBtn"
android:text="所在地"
android:textSize="24sp"
android:layout_marginRight="30dp"
android:onClick="chooseCity"
/>
<EditText
android:id="@+id/cityET"
android:layout_width="match_parent"
/>
</TableRow>
<Button
android:id="@+id/registerBtn"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="注册"
android:onClick="register"
/>
</TableLayout>
</LinearLayout>
(3)activity_register_result.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:id="@+id/main"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical"
tools:context=".RegisterResultActivity">
<TextView
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="恭喜您,注册成功!"
android:textColor="#ff0000"
android:textSize="36sp"
android:gravity="center_horizontal"
/>
<TableLayout
android:layout_width="match_parent"
android:layout_height="wrap_content">
<TableRow>
<TextView
android:text="您的用户名为:"
/>
<TextView
android:id="@+id/userNameTV"
android:textColor="#0000ff"
/>
</TableRow>
<TableRow>
<TextView
android:text="您的密码为:"
/>
<TextView
android:id="@+id/userPwdTV"
android:textColor="#0000ff"
/>
</TableRow>
<TableRow>
<TextView
android:text="您的性别为:"
/>
<TextView
android:id="@+id/userGenderTV"
android:textColor="#0000ff"
/>
</TableRow>
<TableRow>
<TextView
android:text="您的注册城市为:"
/>
<TextView
android:id="@+id/userCityTV"
android:textColor="#0000ff"
/>
</TableRow>
</TableLayout>
</LinearLayout>
(4)city_item.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">
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:id="@+id/city"
android:textColor="#0000ff"
android:padding="5dp"
android:layout_marginLeft="40dp"
android:textSize="20sp"
/>
</LinearLayout>
(5)province_item.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">
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:id="@+id/province"
android:textSize="24sp"
android:textColor="#ff0000"
android:layout_marginLeft="20dp"
android:padding="10dp"
/>
</LinearLayout>
Java代码:
(1)ChooseCityActivity
package com.example.registerdemo;
import android.content.Intent;
import android.os.Bundle;
import android.view.View;
import android.widget.ExpandableListView;
import android.widget.SimpleExpandableListAdapter;
import androidx.activity.EdgeToEdge;
import androidx.appcompat.app.AppCompatActivity;
import androidx.core.graphics.Insets;
import androidx.core.view.ViewCompat;
import androidx.core.view.WindowInsetsCompat;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
public class ChooseCityActivity extends AppCompatActivity {
private String []provinces = new String[]{"湖南省","广东省","江苏省","山东省","浙江省"};
private String [][]cities = new String[][]{{"长沙市","益阳市","张家界","湘西土家族苗族自治州"},
{"广州市","潮汕市","深圳市","惠州市"},
{"南京市","苏州市","扬州市","徐州市"},
{"青岛市","烟台市","威海市","济南市"},
{"杭州市","绍兴市","金华市","舟山市"}};
private List<Map<String,String>> provinceItems = new ArrayList<Map<String,String>>();
private List<List<Map<String,String>>> cityItems = new ArrayList<List<Map<String,String>>>();
private ExpandableListView chooseCityELV =null;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_choose_city);
chooseCityELV = findViewById(R.id.chooseCityELV);
//调用可扩展列表数据初始化方法
initDatas();
//创建列表适配器
SimpleExpandableListAdapter simpleExpandableListAdapter = new SimpleExpandableListAdapter(ChooseCityActivity.this,
provinceItems,R.layout.province_item,new String[]{"province"},new int[]{R.id.province},
cityItems,R.layout.city_item,new String[]{"city"},new int[]{R.id.city}
);
chooseCityELV.setAdapter(simpleExpandableListAdapter);
//可扩展列表的二级子项添加事件监听
chooseCityELV.setOnChildClickListener(new ExpandableListView.OnChildClickListener() {
@Override
public boolean onChildClick(ExpandableListView parent, View v, int groupPosition, int childPosition, long id) {
Intent intent =new Intent();
intent.putExtra("city",cities[groupPosition][childPosition]);//将用户选择的二级子项的城市名数据到intent对象中
setResult(0x11,intent);
ChooseCityActivity.this.finish();//结束当前的ChooseCityActivity
return true;
}
});
}
//对可拓展列表中的项中的数据进行初始化的方法
private void initDatas(){
for (int i=0;i<provinces.length;i++){
Map<String,String> provinceItem = new HashMap<String,String>();
provinceItem.put("province",provinces[i]);
provinceItems.add(provinceItem);//省份数据集合
List<Map<String,String>> cityOFProvince = new ArrayList<Map<String,String>>();
for (int j=0;j<cities[i].length;j++){
Map<String,String> cityItem = new HashMap<String,String>();
cityItem.put("city",cities[i][j]);
cityOFProvince.add(cityItem);//某省的城市数据集合
}
cityItems.add(cityOFProvince);//所有的城市数据集合
}
}
}
(2)MainActivity
package com.example.registerdemo;
import android.app.AlertDialog;
import android.content.Intent;
import android.os.Bundle;
import android.view.View;
import android.widget.Button;
import android.widget.EditText;
import android.widget.RadioButton;
import androidx.activity.EdgeToEdge;
import androidx.annotation.Nullable;
import androidx.appcompat.app.AppCompatActivity;
import androidx.core.graphics.Insets;
import androidx.core.view.ViewCompat;
import androidx.core.view.WindowInsetsCompat;
public class MainActivity extends AppCompatActivity {
private EditText userNameET = null;
private EditText userPwdET = null;
private EditText confirmPwdET = null;
private EditText cityET = null;
private RadioButton maleRBtn = null;
private RadioButton femaleRBtn = null;
private Button registerBtn = null;
private Button cityBtn = null;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
userNameET = findViewById(R.id.userNameET);
userPwdET = findViewById(R.id.userPwdET);
confirmPwdET = findViewById(R.id.confirmPwdET);
cityET = findViewById(R.id.cityET);
maleRBtn = findViewById(R.id.maleRBtn);
femaleRBtn = findViewById(R.id.femaleRBtn);
registerBtn = findViewById(R.id.registerBtn);
cityBtn = findViewById(R.id.cityBtn);
}
public void chooseCity(View view){
//创建一个意图的对象,意图是从当前的MainActivity跳转到ChooseCityActivity
Intent intent = new Intent(MainActivity.this,ChooseCityActivity.class);
//启动ChooseCityActivity并需要一个结果,即用户在ChooseCityActivity中选择的城市名字字符串
startActivityForResult(intent,0);
}
//重写接收ChooseCityActivity返回的数据的方法
@Override
protected void onActivityResult(int requestCode, int resultCode, @Nullable Intent data) {
super.onActivityResult(requestCode,resultCode,data);
if (data != null){
if (resultCode == 0x11){
String city = data.getStringExtra("city");
cityET.setText(city);
}
}
}
public void register(View view){
//调用注册信息合法性检测
String checkResult = checkInfo();
if (checkResult != null){
AlertDialog.Builder builder = new AlertDialog.Builder(MainActivity.this);
builder.setTitle("注册信息失败提示");
builder.setMessage(checkResult);
builder.setPositiveButton("确定",null);
builder.show();
}else {
//封装用户填写的注册信息
Intent intent = new Intent(MainActivity.this, RegisterResultActivity.class);//创建意图的对象从MainActivity跳转到RegisterResultActivity
intent.putExtra("userName",userNameET.getText().toString().trim());
intent.putExtra("userPwd",userPwdET.getText().toString().trim());
String gender = "男";
if (femaleRBtn.isChecked()){
gender = "女";
}
intent.putExtra("userGender",gender);
intent.putExtra("userCity",cityET.getText().toString().trim());
startActivity(intent);//启动RegisterResultActivity
}
}
//注册信息合法性检测的方法
private String checkInfo(){
//检查用户名是否为空
String username = userNameET.getText().toString().trim();//将userNameET中的输入数据提取出来
if (username == null || username.equals("")){
return "用户名不能为空,请重新输入合法用户名~";
}
//检查密码长度是否在6-15位
String userPwd = userPwdET.getText().toString().trim();
if (userPwd.length()<6 || userPwd.length()>15){
return "密码位数不合法,请重新输入6-15位的密码";
}
//检查两次密码是否一致
String userConfirmPwd = confirmPwdET.getText().toString().trim();
if (!userConfirmPwd.equals(userPwd)){
return "两次密码不一致,请重新确认并输入~";
}
return null;
}
}
(3)RegisterResultActivity
package com.example.registerdemo;
import android.content.Intent;
import android.os.Bundle;
import android.widget.TextView;
import androidx.activity.EdgeToEdge;
import androidx.appcompat.app.AppCompatActivity;
import androidx.core.graphics.Insets;
import androidx.core.view.ViewCompat;
import androidx.core.view.WindowInsetsCompat;
public class RegisterResultActivity extends AppCompatActivity {
private TextView userNameTV = null;
private TextView userPwdTV = null;
private TextView userGenderTV = null;
private TextView userCityTV = null;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_register_result);
userNameTV = findViewById(R.id.userNameTV);
userPwdTV = findViewById(R.id.userPwdTV);
userGenderTV = findViewById(R.id.userGenderTV);
userCityTV = findViewById(R.id.userCityTV);
//获取到从MainActivity发送过来的Intent对象
Intent intent = getIntent();
if (intent != null){
userNameTV.setText(intent.getStringExtra("userName"));//从intent对象中通过键名取出值显示在对应的文本框中
userPwdTV.setText(intent.getStringExtra("userPwd"));
userGenderTV.setText(intent.getStringExtra("userGender"));
userCityTV.setText(intent.getStringExtra("userCity"));
}
}
}
4 实验运行结果图



5 实验总结
先写好布局文件,这个实验一共有五个布局文件。在activity_choose_city.xml布局文件中,主要是注册地的选择,因此设置了一个可扩展列表;实验在city_item.xml和province_item.xml布局文件中就是要被选择的省份和城市;在activity_main.xml布局文件中,先设置了一个文本框,文本框中的文字内容自定义,接下来设置一个表布局管理器,有五行,前三行每一行都由一个文本框和一个可编辑文本框组成,第四行是两个可选择按钮,第五行由一个按钮和一个可编辑文本框组成;而activity_register_result.xml布局文件主要是注册成功后的界面显示。
在写Java代码过程中,要进行注册信息合法性监测,主要监测内容包括检查用户名是否为空、检查密码长度是否在6-15位和检查两次密码是否一致,注册失败将提示,注册成功要封装用户填写的注册信息;而在选择注册地时,要创建一个意图的对象,意图是从当前的MainActivity跳转到ChooseCityActivity,而城市选择要先创建列表适配器,对可扩展列表的二级子项添加事件监听,而对可扩展列表的项中的数据进行初始化。
1247

被折叠的 条评论
为什么被折叠?



