移动技术开发:注册案例

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,而城市选择要先创建列表适配器,对可扩展列表的二级子项添加事件监听,而对可扩展列表的项中的数据进行初始化。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

这个西瓜明明超甜却过分低调

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

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

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

打赏作者

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

抵扣说明:

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

余额充值