【Android应用开发之前端——简易App登录页面】

这篇具有很好参考价值的文章主要介绍了【Android应用开发之前端——简易App登录页面】。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

1.完成登录页面布局

各家App的登录页面大同小异,要么是用户名和密码组合登录,要么是手机号和验证码组合登录。如果要做的更好一点,就要提供忘记密码与记住密码等功能。我们的App登录项目把这些功能综合一下,都呈现到页面上。先将效果图奉上:

使用密码登录:
【Android应用开发之前端——简易App登录页面】
使用验证码登录:
【Android应用开发之前端——简易App登录页面】
修改密码:
【Android应用开发之前端——简易App登录页面】
完成以上界面用到了以下新控件:
● 单选按钮RadioButton:用来区分是密码登录还是验证码登录。
● 下拉框Spinner:用于区分用户类型是个人用户还是公司用户。
● 编辑框EditText:用来输入手机号码和密码。
● 相对布局RelativeLayout:指定手机号码的编辑框放在手机号码TextView的右边,这里使用线性布局LinearLayout也可以。
● 框架布局FrameLayout:忘记密码的按钮与密码输入框叠加。为了使页面更美观这里仍采用线性布局。

布局具体实现如下:

<?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" >
    <LinearLayout
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:paddingTop="20dp">
        <RadioGroup
            android:id="@+id/rg_login"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:orientation="horizontal">
        <RadioButton
            android:id="@+id/rb_password"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:paddingRight="70dp"
            android:text="密码登录"/>
        <RadioButton
            android:id="@+id/rb_vertifyCode"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:text="验证码登录" />
        </RadioGroup>
    </LinearLayout>
    <LinearLayout
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:paddingTop="20dp">
        <TextView
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:text="我是:"
            android:paddingLeft="32dp"/>
        <Spinner
            android:id="@+id/spinner"
            android:layout_marginLeft="80dp"
            android:layout_height="wrap_content"
            android:layout_width="150dp"
            android:entries="@array/spinner_string"/>
    </LinearLayout>
    <LinearLayout
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:paddingTop="20dp">
        <TextView
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:paddingLeft="4dp"
            android:text="手机号码:"/>
        <EditText
            android:id="@+id/et_phone"
            android:layout_width="236dp"
            android:layout_height="wrap_content"/>
    </LinearLayout>
    <LinearLayout
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:paddingTop="20dp">
        <TextView
            android:id="@+id/tv_password"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:paddingLeft="4dp"
            android:text="登录密码:"/>
        <EditText
            android:id="@+id/et_password"
            android:layout_width="236dp"
            android:layout_height="wrap_content"/>
        <Button
            android:id="@+id/btn_forget"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:text="忘记密码"/>
    </LinearLayout>
    <Button
        android:id="@+id/btn_login"
        android:layout_marginTop="10dp"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:text="登录"/>
</LinearLayout>
<?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">
    <LinearLayout
        android:layout_marginTop="10dp"
        android:layout_marginLeft="4dp"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content">
    <TextView
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="输入新密码:"/>
    <EditText
        android:id="@+id/et_password_first"
        android:layout_width="236dp"
        android:layout_height="wrap_content"/>
    </LinearLayout>
    <LinearLayout
        android:layout_marginTop="10dp"
        android:layout_marginLeft="4dp"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content">
        <TextView
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:text="确认新密码:"/>
        <EditText
            android:id="@+id/et_password_second"
            android:layout_width="236dp"
            android:layout_height="wrap_content"/>
    </LinearLayout>
    <LinearLayout
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_marginTop="10dp"
        android:layout_marginLeft="4dp">
        <TextView
            android:layout_marginLeft="28dp"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:text="验证码:"/>
        <EditText
            android:id="@+id/et_verifyCode"
            android:layout_width="142dp"
            android:layout_height="wrap_content"/>
        <Button
            android:id="@+id/btn_verifyCode"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:text="获取验证码"/>
    </LinearLayout>
    <Button
        android:id="@+id/btn_confirm"
        android:layout_marginTop="10dp"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:text="确认"/>
</LinearLayout>
<?xml version="1.0" encoding="utf-8"?>
<!--Spinner中的值-->
<resources>
    <string-array name="spinner_string">
        <item>个人用户</item>
        <item>公司用户</item>
    </string-array>
</resources>

2.完成业务逻辑

找回密码的页面挺简单,主要问题是两个页面之间的跳转有哪些注意事项?页面跳转肯定要传递参数,一般唯一标识的手机号码要传过去,不然下一个页面不知道要为哪个手机号码需要改密码;新密码也要传回去,不然上一个页面不知道密码被改成什么了。可以看出页面之间的数据传递是该项目的重点

另外,有一个细微的用户体验问题:用户会去找回密码,肯定是发现输入的密码不对。修改完密码回到登录页面时,密码输入框里还是原来错误的密码,此时用户清空错误密码才能输入新密码。我们的App想要用户觉得好用,就得急用户之所急、想用户之所想,像之前错误密码的情况应当由App再返回登录页面时自动清空原来错误的密码。自动清空的操作放在registerForActivityResult方法中处理是一个方法,但这样处理有一个问题,如果用户直接按返回键回到登录页面,registerForActivityResult方法发现数据为空就不会处理。

其实这个问题并不难,我们只需重写onRestart方法(确保是返回页面),在方法内部加上清空密码框的处理即可。这样一来,无论用户是修改完密码回到登录页,还是点击返回键回到登录页,App都会自动清空密码框。

使用验证码登录时,App要向用户手机发送短信验证码,但发送短信需要服务器支持,所以这里暂时使用随机数模拟验证码,然后以对话框AlertDialog的形式在界面上提示用户。

3.根据逻辑编写功能(代码示例)

//LoginMainActivity
package com.example.exercise;

import androidx.activity.result.ActivityResultLauncher;
import androidx.activity.result.contract.ActivityResultContracts;
import androidx.appcompat.app.AppCompatActivity;
import android.app.Activity;
import android.app.AlertDialog;
import android.content.DialogInterface;
import android.content.Intent;
import android.os.Bundle;
import android.view.View;
import android.widget.AdapterView;
import android.widget.Button;
import android.widget.EditText;
import android.widget.RadioButton;
import android.widget.RadioGroup;
import android.widget.Spinner;
import android.widget.TextView;
import android.widget.Toast;

public class LoginMainActivity extends AppCompatActivity implements View.OnClickListener, RadioGroup.OnCheckedChangeListener {
    private EditText et_phone;
    private EditText et_password;
    private RadioButton rb_password;
    private RadioButton rb_verifyCode;
    private Button btn_forget;
    private String mVerifyCode;
    private String mPassword;
    private String phone;
    private String mType;
    private Spinner type_spinner;
    private String[] type;
    private ActivityResultLauncher<Intent> register;
    private TextView tv_password;

    @Override
    protected void onCreate(Bundle savedInstanceState){
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_login);
        btn_forget = findViewById(R.id.btn_forget);
        rb_password = findViewById(R.id.rb_password);
        rb_verifyCode = findViewById(R.id.rb_vertifyCode);
        tv_password = findViewById(R.id.tv_password);
        //获取spinner中数组的值
        type_spinner = findViewById(R.id.spinner);
        type = getResources().getStringArray(R.array.spinner_string);
        type_spinner.setOnItemSelectedListener(new AdapterView.OnItemSelectedListener() {
            @Override
            public void onItemSelected(AdapterView<?> adapterView, View view, int position, long id) {
                mType = type[position];
            }
            @Override
            public void onNothingSelected(AdapterView<?> adapterView) {
            }
        });
        findViewById(R.id.btn_forget).setOnClickListener(this);
        findViewById(R.id.btn_login).setOnClickListener(this);
        findViewById(R.id.rb_vertifyCode).setOnClickListener(this);
        RadioGroup rg_login = findViewById(R.id.rg_login);
        rg_login.setOnCheckedChangeListener(this);
        //获取下个页面返回的数据
        register = registerForActivityResult(new ActivityResultContracts.StartActivityForResult(), result -> {
            if(result != null){
                Intent intent = result.getData();
                if(intent != null && result.getResultCode() == Activity.RESULT_OK)
                mPassword = intent.getStringExtra("new_password");
            }
        });
    }

    public void onClick(View v){
        et_phone = findViewById(R.id.et_phone);
        et_password = findViewById(R.id.et_password);
        phone = et_phone.getText().toString();
        if(v.getId() == R.id.btn_forget){
            if(phone == null || phone.length() < 11){
                Toast.makeText(this, "请输入正确的手机号", Toast.LENGTH_SHORT).show();
                return;
            }
            if(rb_password.isChecked() == true){
                //给下个页面传递数据
                Intent intent = new Intent(this, LoginForgetActivity.class);
                intent.putExtra("phone", phone);
                register.launch(intent);
            } else if(rb_verifyCode.isChecked() == true){
                mVerifyCode = String.format("%06d", (int)(Math.random() * 1000000 % 10000000));
                AlertDialog.Builder builder = new AlertDialog.Builder(this);
                builder.setTitle("请记住验证码");
                builder.setMessage("手机号" + phone +",本次验证码是" + mVerifyCode + ",请输入验证码");
                builder.setPositiveButton("好的", null);
                AlertDialog alert = builder.create();
                alert.show();
            }
        } else if(v.getId() == R.id.btn_login){
            if(phone == null || phone.length() < 11){
                Toast.makeText(this, "请输入正确的手机号", Toast.LENGTH_SHORT).show();
                return;
            }
            if(rb_password.isChecked() == true){
                if(et_password.getText().toString().equals(mPassword) != true){
                    Toast.makeText(this, "请输入正确的密码", Toast.LENGTH_SHORT).show();
                    return;
                } else {
                    loginSuccess();
                }
            } else {
                if(et_password.getText().toString().equals(mVerifyCode) != true){
                    Toast.makeText(this, "验证码错误,请重新输入!", Toast.LENGTH_SHORT).show();
                    return;
                } else {
                    loginSuccess();
                }
            }
        }
    }
    @Override
    protected void onRestart(){
        et_password.setText("");
        super.onRestart();
    }
    private void loginSuccess(){
        String desc = String.format("您的手机号码是%s,类型是%s。恭喜你通过登陆验证!", et_phone.getText().toString(), mType);
        AlertDialog.Builder builder = new AlertDialog.Builder(this);
        builder.setTitle("登录成功");
        builder.setMessage(desc);
        builder.setPositiveButton("确定", new DialogInterface.OnClickListener() {
            @Override
            public void onClick(DialogInterface dialogInterface, int i) {
                onRestart();
            }
        });
        AlertDialog alert = builder.create();
        alert.show();
    }

    @Override
    public void onCheckedChanged(RadioGroup radioGroup, int checkedId) {
        switch (checkedId){
            case R.id.rb_password:
                tv_password.setText("登录密码:");
                btn_forget.setText("忘记密码");
                break;
            case R.id.rb_vertifyCode:
                tv_password.setText("  验证码  :");
                btn_forget.setText("获取验证码");
                break;
        }
    }
}
//LoginForgetActivity
package com.example.exercise;

import androidx.appcompat.app.AlertDialog;
import androidx.appcompat.app.AppCompatActivity;
import android.app.Activity;
import android.content.DialogInterface;
import android.content.Intent;
import android.os.Bundle;
import android.view.View;
import android.widget.EditText;
import android.widget.Toast;

public class LoginForgetActivity extends AppCompatActivity implements View.OnClickListener {
    private EditText et_password_first;
    private EditText et_password_second;
    private EditText et_verifyCode;
    private String mVerifyCode;
    private String mPhone;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_login_forget);
        et_password_first = findViewById(R.id.et_password_first);
        et_password_second = findViewById(R.id.et_password_second);
        et_verifyCode = findViewById(R.id.et_verifyCode);
        findViewById(R.id.btn_confirm).setOnClickListener(this);
        findViewById(R.id.btn_verifyCode).setOnClickListener(this);
        mPhone = getIntent().getStringExtra("phone");
    }

    @Override
    public void onClick(View v) {
        if(v.getId() == R.id.btn_verifyCode){
            if(mPhone == null || mPhone.length() < 11){
                Toast.makeText(this, "请输入正确的手机号", Toast.LENGTH_SHORT).show();
                return;
            }
            mVerifyCode = String.format("%06d", (int)(Math.random() * 1000000 % 1000000));
            AlertDialog.Builder builder = new AlertDialog.Builder(this);
            builder.setTitle("请记住验证码");
            builder.setMessage("手机号" + mPhone + ",本次验证码是" + mVerifyCode + ",请输入验证码");
            builder.setPositiveButton("好的", null);
            AlertDialog alert = builder.create();
            alert.show();
        } else if(v.getId() == R.id.btn_confirm){
            String password_first = et_password_first.getText().toString();
            String password_second = et_password_second.getText().toString();
            if(password_first == null || password_first.length() < 6 || password_second == null || password_second.length() < 6){
                Toast.makeText(this, "请输入正确的新密码", Toast.LENGTH_SHORT).show();
                return;
            } else if(password_first.equals(password_second) != true){
                Toast.makeText(this, "两次输入的新密码不一致", Toast.LENGTH_SHORT).show();
                return;
            } else if(et_verifyCode.getText().toString().equals(mVerifyCode) != true){
                Toast.makeText(this, "请输入正确的验证码", Toast.LENGTH_SHORT).show();
                return;
            } else {
                EditSuccess();
                //Toast.makeText(this, "密码修改成功", Toast.LENGTH_SHORT).show();
                Intent intent = new Intent();
                intent.putExtra("new_password", password_first);
                setResult(Activity.RESULT_OK, intent);
            }
        }
    }
    private void EditSuccess(){
        String desc = String.format("修改密码成功!点击”确定“按钮返回上个页面");
        android.app.AlertDialog.Builder builder = new android.app.AlertDialog.Builder(this);
        builder.setTitle("修改成功");
        builder.setMessage(desc);
        builder.setPositiveButton("确认返回", new DialogInterface.OnClickListener() {
            @Override
            public void onClick(DialogInterface dialogInterface, int i) {
                finish();
            }
        });
        android.app.AlertDialog alert = builder.create();
        alert.show();
    }
}

简易App登录页面到这里就完成了!文章来源地址https://www.toymoban.com/news/detail-485740.html

到了这里,关于【Android应用开发之前端——简易App登录页面】的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • Android开发——实现简易登录功能

     

    2024年04月23日
    浏览(40)
  • 【软件应用开发】小米便签APP维护开发

    本文主要介绍在小米便签APP原有功能的基础上,设计并实现了便签添加图片的功能,从开发过程、运行界面、源代码三个方面进行详细介绍。 本文引用小米便签社区开源版代码:https://github.com/MiCode/Notes 小米便签APP维护开发完整源代码地址:https://download.csdn.net/download/weixin_

    2024年02月02日
    浏览(86)
  • HarmonyOS应用开发实战—登录页面【ArkTS】

    HarmonyOS(鸿蒙操作系统)是华为公司推出的一种分布式操作系统。它被设计为一种全场景、全连接的操作系统,旨在实现在各种设备之间的无缝协同和共享,包括智能手机、

    2024年02月05日
    浏览(51)
  • 基于flask的web应用开发——登录界面

    打算在云服务器上部署一个 TODO LIST 来练手,也就是一个代办事项提醒表。 本节学习使用 flask 库制作出一个登录界面,并且使用Redis数据库实现账号密码加载功能,关于注册界面我们下次再加上。 注意!!!请确保你安装了 redis 数据库,否则会因为无法登录数据库而报错。

    2024年02月08日
    浏览(63)
  • 开发一款APP应用的详细流程

    APP开发的流程并不复杂,接下来就带大家一起看一下一套完整的APP开发流程包含哪些步骤。 一、基本功能需求阶段 01、前期功能需求讨论 在开发前,需要产品经理跟客户充分沟通,首先要了解客户开发的 APP类型、平台、功能以及产品设计的需求、时长、预算等等。 可以先做

    2024年02月09日
    浏览(40)
  • 1.鸿蒙应用程序开发app_hap开发环境搭建

    DevEco Studio 3.1配套支持HarmonyOS 3.1版本及以上的应用及服务开发,提供了代码智能编辑、低代码开发、双向预览等功能,以及轻量构建工具DevEco Hvigor 、本地模拟器,持续提升应用及服务开发效率   Windows 操作系统:Windows 10/11 64 位 内存:8GB 及以上 硬盘:100GB 及以上 分辨率:

    2024年02月04日
    浏览(86)
  • 直播软件app开发:如何开发一个可以免费打扑克的直播应用?

    作为一个技术开发人员,我深知直播软件app开发的重要性。在这个数字化时代,越来越多的人选择使用直播软件来分享自己的生活和与朋友互动。而随着技术的发展,直播软件也不断更新和改进,为用户提供更好的体验和功能。 对于开发者来说,以视频直播app源码为基础进行

    2024年02月16日
    浏览(67)
  • Android应用开发(1)Android Studio开发环境搭建

    Android应用开发学习笔记——目录索引 本章介绍搭建Android Studio应用开发环境,创建并编译App工程,运行和调试App。 谷歌开发者网站可直接下载AndroidStudio,下载链接:https://developer.android.com/studio 点击【Download Android Studio Electric Eel】 勾选【I have read and agree with the above terms and

    2024年02月07日
    浏览(49)
  • Python应用-web应用开发(上)前端part

    版权声明:转载请联系我获得授权 参考视频:Python的web开发全家桶 参考学习曲线:Python入门技能树 在网页右键点检查可查看源码 选中点击想要的区域可以得到对应源码区域 styles中为样式定义 咱们网站与别人的不一样: Flask框架为了让咱们写标签方便,支持将字符串写入到

    2024年02月04日
    浏览(41)
  • Spring Boot:Web应用开发之登录与退出的实现

    登录与退出功能作为 Web 应用中的基础且重要的组成部分,直接关系到用户的安全和隐私保护。通过实现登录与退出功能,可以对用户的身份进行验证和授权,确保只有合法的用户才能访问特定的资源或执行特定的操作。同时,退出功能也为用户提供了便捷的方式来结束当前

    2024年04月23日
    浏览(32)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包