Android实现简单的登录界面

2023-11-09

该登录界面一共实现三个功能:

1.实现登录

2.实现注册

3.实现记住密码

AndroidManifest.xml 文件:

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools">

    <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.Smart_Campus"
        tools:targetApi="31">
        <activity
            android:name=".MainActivity"
            android:exported="true"
            android:launchMode="standard">
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />

                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
        </activity>
        <activity android:name=".loginActivity"/>
        <activity android:name=".registeredActivity"/>
    </application>
</manifest>

bean文件中的Account类:

package com.example.smart_campus.bean;

public class Account {
    private int id;
    private String account;
    private String password;

    public Account(int id, String account, String password) {
        this.id = id;
        this.account = account;
        this.password = password;
    }

    public Account() {
    }

    public int getId() {
        return id;
    }

    public void setId(int id) {
        this.id = id;
    }

    public String getAccount() {
        return account;
    }

    public void setAccount(String account) {
        this.account = account;
    }

    public String getPassword() {
        return password;
    }

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

 db文件夹中的AccountService:

package com.example.smart_campus.db;

import android.content.Context;
import android.database.Cursor;
import android.database.sqlite.SQLiteDatabase;

import com.example.smart_campus.bean.Account;

public class AccountService {
    private DataBaseHelper dataBaseHelper;
    public AccountService(Context context) {
        dataBaseHelper = new DataBaseHelper(context);
    }

    //登录
    public Boolean login(String account, String password){
        SQLiteDatabase sqLiteDatabase = dataBaseHelper.getReadableDatabase();
        String sql = "select * from Account where act = ? and pwd = ?";
        Cursor cursor = sqLiteDatabase.rawQuery(sql,new String[]{account,password});
        if (cursor.moveToFirst()) {
            cursor.close();
            return true;
        } else {
            return false;
        }
    }

    //注册
    public Boolean registered(Account account){
        SQLiteDatabase sqLiteDatabase = dataBaseHelper.getReadableDatabase();
        String sql = "insert into Account(act,pwd) values(?,?)";
        Object[] obj = {account.getAccount(),account.getPassword()};
        sqLiteDatabase.execSQL(sql,obj);
        return true;
    }
}

db文件夹中的DataBaseHelper:

package com.example.smart_campus.db;

import android.content.Context;
import android.database.sqlite.SQLiteDatabase;
import android.database.sqlite.SQLiteOpenHelper;

import androidx.annotation.Nullable;

public class DataBaseHelper extends SQLiteOpenHelper {
    public static final String DATABASE_NAME = "Smart_Campus.db";
    public static final int DATABASE_VERSION = 1;
    public static final String TABLE_NAME = "Account";
    public static final String COLUMN_ID = "id";
    public static final String COLUMN_Account = "act";
    public static final String COLUMN_Password = "pwd";
    public DataBaseHelper(@Nullable Context context) {
        super(context, DATABASE_NAME, null, DATABASE_VERSION);
    }

    //创建数据库
    @Override
    public void onCreate(SQLiteDatabase db) {
        String query = "CREATE TABLE " + TABLE_NAME +
                " (" + COLUMN_ID + " INTEGER PRIMARY KEY AUTOINCREMENT, " +
                      COLUMN_Account + " VARCHAR(20), " +
                      COLUMN_Password + " VARCHAR(20))";
        db.execSQL(query);
    }

    @Override
    public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {

    }
}

MainActivity:

package com.example.smart_campus;

import android.content.Intent;
import android.content.SharedPreferences;
import android.os.Bundle;
import android.preference.PreferenceManager;
import android.view.View;
import android.widget.Button;
import android.widget.CheckBox;
import android.widget.EditText;
import android.widget.Toast;

import androidx.annotation.Nullable;
import androidx.appcompat.app.AppCompatActivity;

import com.example.smart_campus.db.AccountService;

public class MainActivity extends AppCompatActivity {
    private SharedPreferences sharedPreferences;
    private SharedPreferences.Editor editor;
    private CheckBox rememberPass;

    @Override
    protected void onCreate(@Nullable Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        Button button_login = findViewById(R.id.login);
        EditText account = findViewById(R.id.account);
        EditText password = findViewById(R.id.password);
        AccountService accountService = new AccountService(this);
        rememberPass = findViewById(R.id.reb_pwd);
        sharedPreferences = PreferenceManager.getDefaultSharedPreferences(this);
        boolean isRemember = sharedPreferences.getBoolean("remember_password", false);
        if (isRemember) {
            String reb_account = sharedPreferences.getString("account", "");
            String reb_password = sharedPreferences.getString("password", "");
            account.setText(reb_account);
            password.setText(reb_password);
            rememberPass.setChecked(true);
        }
        button_login.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                String act = account.getText().toString();
                String pwd = password.getText().toString();
                Boolean flag = accountService.login(act, pwd);
                if (flag) {
                    editor = sharedPreferences.edit();
                    if (rememberPass.isChecked()) {
                        editor.putBoolean("remember_password", true);
                        editor.putString("account", act);
                        editor.putString("password", pwd);
                    } else {
                        editor.clear();
                    }
                    editor.commit();
                    Intent intent = new Intent(MainActivity.this, loginActivity.class);
                    startActivity(intent);
                } else {
                    Toast.makeText(MainActivity.this, "账号或密码错误!", Toast.LENGTH_SHORT).show();
                }
            }
        });
        Button button_registered = findViewById(R.id.registered);
        button_registered.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                Intent intent = new Intent(MainActivity.this, registeredActivity.class);
                startActivity(intent);
            }
        });
    }
}

 loginActivity

package com.example.smart_campus;

import android.os.Bundle;

import androidx.annotation.Nullable;
import androidx.appcompat.app.AppCompatActivity;

public class loginActivity extends AppCompatActivity {
    @Override
    public void onCreate(@Nullable Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.login);
    }
}

registeredActivity

package com.example.smart_campus;

import android.content.DialogInterface;
import android.content.Intent;
import android.os.Bundle;
import android.view.View;
import android.widget.EditText;

import androidx.annotation.Nullable;
import androidx.appcompat.app.AlertDialog;
import androidx.appcompat.app.AppCompatActivity;

import com.example.smart_campus.bean.Account;
import com.example.smart_campus.db.AccountService;

public class registeredActivity extends AppCompatActivity {
    @Override
    public void onCreate(@Nullable Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.registered);
    }
    public void myClick(View view){
        if (view.getId() == R.id.reg){
            AlertDialog.Builder builder = new AlertDialog.Builder(this);
            EditText new_account = findViewById(R.id.new_account);
            EditText new_pwd = findViewById(R.id.new_pwd);
            EditText re_pwd = findViewById(R.id.re_pwd);
            AccountService accountService = new AccountService(this);
            if (!new_account.getText().toString().isEmpty() && new_pwd.getText().toString().equals(re_pwd.getText().toString())){
                Account account = new Account();
                account.setAccount(new_account.getText().toString());
                account.setPassword(new_pwd.getText().toString());
                accountService.registered(account);
                builder.setTitle("提示");
                builder.setMessage("注册成功");
                builder.setPositiveButton("确定", new DialogInterface.OnClickListener() {
                    @Override
                    public void onClick(DialogInterface dialog, int which) {
                        Intent intent = new Intent(registeredActivity.this, MainActivity.class);
                        startActivity(intent);
                    }
                });
                builder.setNegativeButton("取消",null);
                builder.show();
            } else {
                builder.setTitle("提示");
                builder.setMessage("注册失败!新账号为空或新密码与确认密码不同");
                builder.setNegativeButton("确认",null);
                builder.show();
            }
        }
    }
}

layout文件中的activity_main

<?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"
    tools:context=".MainActivity"
    android:orientation="vertical">

    <TextView
        android:layout_width="match_parent"
        android:layout_height="50dp"
        android:text="Hello Android"
        android:textStyle="bold"
        android:gravity="center"
        android:textSize="30dp"
        android:layout_marginTop="10dp"
        />
    <EditText
        android:id="@+id/account"
        android:layout_width="200dp"
        android:layout_height="48dp"
        android:hint="请输入账号"
        android:layout_gravity="center"
        android:layout_marginTop="120dp"
        />
    <EditText
        android:id="@+id/password"
        android:layout_width="200dp"
        android:layout_height="48dp"
        android:hint="请输入密码"
        android:inputType="textPassword"
        android:layout_gravity="center"
        android:layout_marginTop="10dp"
        />
    <CheckBox
        android:id="@+id/reb_pwd"
        android:layout_width="100dp"
        android:layout_height="20dp"
        android:layout_marginLeft="100dp"
        android:text="记住密码"
        />
    <Button
        android:id="@+id/login"
        android:layout_width="200dp"
        android:layout_height="wrap_content"
        android:text="登录"
        android:layout_gravity="center"
        android:onClick="btnClick"
        android:layout_marginTop="10dp"
        />

    <Button
        android:id="@+id/registered"
        android:layout_width="200dp"
        android:layout_height="wrap_content"
        android:text="注册"
        android:layout_gravity="center"
        android:onClick="btnClick"
        />
</LinearLayout>

layout中的login文件

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent">
    <TextView
        android:id="@+id/login_text"
        android:layout_width="match_parent"
        android:layout_height="60dp"
        android:text="登录成功!"
        android:textSize="40dp"
        android:gravity="center"
        android:layout_gravity="center_vertical"
        />
</LinearLayout>

layout文件中的registered

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical"
    android:gravity="center_horizontal">
    <TextView
        android:layout_width="match_parent"
        android:layout_height="50dp"
        android:text="Hello Android"
        android:textStyle="bold"
        android:gravity="center"
        android:textSize="30dp"
        android:layout_marginTop="10dp"
        />
    <TextView
        android:layout_width="match_parent"
        android:layout_height="50dp"
        android:layout_marginTop="30dp"
        android:text="注册界面"
        android:textStyle="bold"
        android:gravity="center"
        android:textSize="30dp"
        />
    <EditText
        android:id="@+id/new_account"
        android:layout_width="200dp"
        android:layout_height="48dp"
        android:layout_marginTop="30dp"
        android:hint="输入新账号"
        android:layout_gravity="center"/>
    <EditText
        android:id="@+id/new_pwd"
        android:layout_width="200dp"
        android:layout_height="48dp"
        android:layout_marginTop="10dp"
        android:hint="输入新密码"
        android:layout_gravity="center"/>
    <EditText
        android:id="@+id/re_pwd"
        android:layout_width="200dp"
        android:layout_height="48dp"
        android:layout_marginTop="10dp"
        android:hint="确认新密码"
        android:layout_gravity="center"/>
    <Button
        android:id="@+id/reg"
        android:layout_width="200dp"
        android:layout_height="48dp"
        android:layout_marginTop="30dp"
        android:text="确认注册"
        android:onClick="myClick"
        />

</LinearLayout>
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Android实现简单的登录界面 的相关文章

  • 添加监听器与设置监听器

    添加监听器和设置监听器有什么区别 e g addTextChangedListener textWatcher setOnClickListener clickListener Answer 在 aioobe 的回答之后 我在我的项目中对此
  • SugarORM 错误或缺少数据库

    我尝试让 Android 项目与 SugarORM 一起使用 但是 我遇到了以下错误 引起原因 android database sqlite SQLiteException 没有这样的表 DOCUMENT 代码1 编译时 INSERT O
  • Android Studio Profiler 中显示“无可调试进程”

    当我尝试在 Android Studio 中使用探查器时 我能够看到已连接的设备 但在探查器中收到 无可调试进程 有人可以帮助我为什么我收到 不可调试的进程 吗 您可以尝试以下任意 全部操作 使缓存失效并重新启动Android Studio
  • java中将函数作为参数传递

    我正在熟悉 Android 框架和 Java 并希望创建一个通用的 NetworkHelper 类 该类将处理大部分网络代码 使我能够从中调用网页 我按照developer android com 上的这篇文章创建了我的网络类 http d
  • POST 请求出现 500 内部服务器错误

    这是我向服务器发送 POST 请求的代码 要发布到服务器的 JSON User Name dog Password 123 我如何创建 JSON 对象 object new JSONObject JSONObject jsonObject
  • 旋转对话框的自定义主题

    我想自定义当我单击 spinnermode dialog 中的微调器时出现的对话框的外观 我想使用对话框片段 但没有找到文档 是否可以 不会 外观是固定的 给人一种操作系统的感觉 您必须创建自己的微调器才能执行此操作 这并不容易 但如果微调
  • 如何修复 Kotlin JobCancellationException?

    由于 Kotlin JobCancellationException 我发生了崩溃 以下是有关崩溃的详细信息 kotlinx coroutines JobCancellationException Job was cancelled job
  • 字符串生成器最大长度

    我想知道字符串生成器 或字符串缓冲区 的最大容量是多少 我的 Android 应用程序中有一个静态变量 它应该保存日志字符串 它最多可以容纳 130 行和大约 10000 个字符 我如果我附加更多内容 但它只是不显示 没有错误 没有例外 所
  • Android 时间选择器在分钟滚动时自动更改小时

    例如 当我在 TimePicker 上滚动分钟时 在将分钟滚动到 59 后 小时会自动滚动到 7 因此新时间将为 07 59 同样的方式 如果我有 07 59 并且我将分钟滚动到 00 小时将自动滚动到 8 所以时间将是 08 00 此逻辑
  • 如何删除旧版本的Android Studio

    我必须释放硬盘中的一些空间 并寻找要删除的内容 我发现我有许多引用旧版本的 Android Studio AS 文件夹 我发现文件夹的路径是 C Users mysuername 我想要的是删除旧版本并只保留最新版本的方法 当时是 ASPr
  • Kotlin + Room:java.lang.IllegalArgumentException:void 无法转换为元素

    我试图在我的 Java Kotlin 项目中添加 Room 但是当我尝试编译该项目时 它失败了 app kaptDebugKotlin出现以下错误 e java lang IllegalStateException failed to an
  • 某些设备上的启动画面扭曲

    我在修复 Android 上的启动画面扭曲问题时遇到问题 我正在使用 React Native 请注意 这种情况仅发生在某些设备上 例如 我有一台 Android 版本为 4 2 2 的三星 启动画面不扭曲 而 Android 版本为 8
  • 当我转到下一个活动并再次返回时,如何恢复活动的值?

    我希望当用户返回我的第一个活动时恢复编辑文本的值 请帮帮我 提前致谢 这是我的第一个活动代码 用于在编辑文本中获取用户值 public class IntentActivity extends Activity EditText ed1 e
  • 如何在具有多种字体大小的 TextView 中调整行高?

    我有一个包含 Spannable 字符串的 TextView 该字符串包含一堆文本 其中第一个单词的字体大小是字符串其余部分的两倍 问题在于 由于第一个字的大小增加 第一行和第二行之间的行间距比后续行之间的行间距大得多 http img s
  • 等待视图通过 IdleResource 变得可见

    我正在使用 Espresso 2 2 编写仪器测试 我想测试的流程 测试点击的单选按钮 onClick 向 API 发起请求 每次不同时间我收到回复后 积极响应触发活动中调用的接口方法 onRequestSuccess 我正在屏幕上显示名为
  • 如何在flutter上关注android tv应用程序中的列表视图项目

    我想在 flutter 中构建一个 android 电视应用程序 几乎所有事情都已完成 但一个问题是我无法集中注意力 例如一些弹出效果或边框更改任何告诉用户您现在正在使用此项目的内容 我们在列表视图中迭代的项目 我想要在应用程序中看到的图像
  • NumberFormatException:无效的整数:“8.0dip”仅在 Galaxy Tab 2 上

    我目前面临 Galaxy Tab 10 1 2 GT P5110 的故障 该故障给我带来了该错误 但仅在该设备上 我尝试了不同的模拟器 我使用 genymotion Nexus 5 7 10 Galaxy S3 4 5 Galaxy Not
  • Android:适合SystemWindows和换行符干扰bottomSheets

    我发现如果父布局包含android fitsSystemWindows true 当发生与视图相关的操作时 它会干扰我的 BottomSheets 定位 具体来说 我遇到的是 文本视图中的换行符将触发底页偏移系统 通知栏的高度 换行符 fi
  • 使 autocompletetextview 看起来像 edittext

    我正在使用 AutoCompleteTextView Roboto 自动完成文本视图 https github com johnkil Android RobotoTextView blob master robototextview sr
  • Oreo:应用程序未运行时不会触发警报

    我有相对简单的设置 应该在一天中的特定时间触发警报并向用户显示通知 这是相关代码 设置闹钟 long inTime expirationTime Calendar getInstance getTimeInMillis 10000 Inte

随机推荐

  • getjson ajax webpy,ajaxwebpy

    ajaxweb py is a framework for the library web py It which makes it very easy to make sites interactive using AJAX techno
  • 手机有时触摸失灵解决方法

    1 屏幕不干净造成的屏幕不灵敏 用干净的无尘布将手机上的脏污 水渍擦拭干净 2 手机有贴膜 确认用户是否贴膜之后出现屏幕失灵问题 可将膜去掉再使用对比 3 操作耽搁软件时屏幕失灵 可备份好软件数据 进入设置 应用与权限 更多设置 应用管理
  • seed+transformer+finetune+图文融合+VLP+Prompt Learning整合

    1 Seed 在神经网络中 参数默认是进行随机初始化的 不同的初始化参数往往会导致不同的结果 如果不设置的话每次训练时的初始化都是随机的 导致结果不确定 当得到比较好的结果时我们通常希望这个结果是可以复现的 如果设置初始化 则每次初始化都是
  • 剑指 Offer 66. 构建乘积数组(java+python)

    给定一个数组 A 0 1 n 1 请构建一个数组 B 0 1 n 1 其中 B i 的值是数组 A 中除了下标 i 以外的元素的积 即 B i A 0 A 1 A i 1 A i 1 A n 1 不能使用除法 示例 输入 1 2 3 4 5
  • jmeter性能测试——性能的评定标准

    性能的评定标准 性能指标 响应时间 指的是从客户端发出请求开始 到接收到服务器的响应 并且看到响应的内容为止 这个时间段 称为响应时间 响应时间 网络传输的时间 服务器处理的时间 浏览器解析呈现的时间 如何弱化网络传输的时间和浏览器解析呈现
  • PackageInstaller 原理简

    http topic csdn net u 20110410 23 43571CFA 87B2 4E36 880C 1FA499BA32B0 html 应用安装是智能机的主要特点 即用户可以把各种应用 如游戏等 安装到手机上 并可以对其进行
  • 华为OD机试 - 任务最优调度(Java)

    题目描述 给定一个正整数数组表示待系统执行的任务列表 数组的每一个元素代表一个任务 元素的值表示该任务的类型 请计算执行完所有任务所需的最短时间 任务执行规则如下 任务可以按任意顺序执行 且每个任务执行耗时间均为1个时间单位 两个同类型的任
  • Nuxt 3.0 全栈开发:五种数据获取 API 选择和应用最佳实践

    Nuxt 3 0 全栈开发 杨村长 掘金小册核心知识 工程架构 全栈进阶 项目实战 快速精通 Nuxt3 开发 Nuxt 3 0 全栈开发 由杨村长撰写 299人购买https s juejin cn ds S6p7MVo 上一讲我们学习了
  • elementui 集成富文本编辑器vue-quill-editor

    第一步 安装vue quill editor cnpm install vue quill editor S 第二步 VUE项目集成vue quill editor main js 文件 添加如下代码片段 import VueQuillEd
  • 概率论 方差公式_考研冲刺篇

    众所周知 概率论的知识点又多又杂 需要我们系统的归类并掌握 这样才能获得得分 为此 小业整理了 2020考研数学 概率论各章节知识点梳理 的相关内容 希望对大家有所帮助 第一部分 随机事件和概率 1 样本空间与随机事件 2 概率的定义与性质
  • keil5打开MDK4的程序提示不兼容

    1 如下图 我的程序是用keil4写的 可是用keil5打开会提示不兼容的问题 keil提供了两个解决方案 Migrate to Device Pack 迁移到设备包 和 Install Legacy Support 安装遗留支持 用第二种
  • [数值计算-18]:最小二乘的求解法3 - 链式求导与梯度下降法求解loss函数的最优化参数(Python, 超详细、可视化)

    作者主页 文火冰糖的硅基工坊 https blog csdn net HiWangWenBing 本文网址 https blog csdn net HiWangWenBing article details 119978818 目录 前置文
  • 4.4创建型模式————抽象工厂模式

    前面介绍的工厂方法模式中考虑的是一类产品的生产 如畜牧场只养动物 电视机厂只生产电视机 计算机软件学院只培养计算机软件专业的学生等 同种类称为同等级 也就是说 工厂方法模式只考虑生产同等级的产品 但是在现实生活中许多工厂是综合型的工厂 能生
  • MoviePy版本过低,不建议在Python中使用

    MoviePy版本过低 不建议在Python中使用 近年来 Python成为了一个非常流行的编程语言 很多人利用Python进行视频处理等工作 而MoviePy是一个非常好用的模块 但是 当前版本的MoviePy v0 2 3 5 dev1
  • 个人总结:推荐算法篇(附协同过滤等) 综述

    现代推荐系统 对于在线部分来说 一般要经历几个阶段 首先通过召回环节 将给用户推荐的物品降到千以下规模 因为在具备一定规模的公司里 是百万到千万级别 甚至上亿 所以对于每一个用户 如果对于千万级别物品都使用先进的模型挨个进行排序打分 明显速
  • 【Numpy】不再迷茫!np.mean() axis参数通俗解释。

    np mean 注释截取 axis None or int or tuple of ints optional Axis or axes along which the means are computed The default is t
  • burp爆破mysql_[技巧]使用Burpsuite辅助Sqlmap进行POST注入测试

    我们在使用Sqlmap进行post型注入时 经常会出现请求遗漏导致注入失败的情况 这里分享一个小技巧 即结合burpsuite来使用sqlmap 用这种方法进行post注入测试会更准确 操作起来也非常容易 1 浏览器打开目标地址 http
  • 雷电模拟器一直android正在启动,雷电安卓模拟器启动后没反应、无法启动、闪退的3种解决办法-针对2020年4月4号出现的...

    今天 2020年4月5号 小编打开雷电多开器 点击 启动 按钮启动模拟器 发现模拟器的窗口没有弹出来 感觉没有什么反应 雷电多开管理器的 启动 按钮 变成 关闭 按钮后 等几秒就又变成 启动 按钮了 多次尝试后 最终确定我的雷电模拟器无法启
  • 怎样把文档保存在云服务器,怎样把文件存在云服务器上

    怎样把文件存在云服务器上 内容精选 换一换 安装传输工具在本地主机和Windows云服务器上分别安装数据传输工具 将文件上传到云服务器 例如QQ exe 在本地主机和Windows云服务器上分别安装数据传输工具 将文件上传到云服务器 例如Q
  • Android实现简单的登录界面

    该登录界面一共实现三个功能 1 实现登录 2 实现注册 3 实现记住密码 AndroidManifest xml 文件