安卓开发之登录页面(跳转版)

目录

  • 前言:
  • 基础夯实:
  • 效果展示:
  • 核心代码:
  • 网盘源码:

前言:

熟悉安卓开发的基础知识,了解,弹窗,两个页面进行跳转,页面的布局,按钮,文本框的使用,初学安卓,不足之处见谅

基础夯实:

对于初学安卓开发的你来说,掌握以下基础知识是非常重要的,包括Activity的生命周期、页面布局、弹窗、页面跳转、按钮以及文本框的使用等。下面我将逐一介绍这些知识点:

一、Activity的生命周期
Activity是Android应用中的单个屏幕,它包含了用户可以与之交互的UI元素。了解Activity的生命周期对于开发高质量的Android应用至关重要。Activity的生命周期包括以下几个主要阶段:

onCreate():Activity被创建时调用,用于初始化Activity的基本状态,如加载布局、初始化变量等。
onStart():Activity对用户可见时调用。
onResume():Activity开始与用户交互时调用。
onPause():当Activity失去焦点但仍然可见时(如另一个非全屏或透明的Activity被放置在它上面时)调用。
onStop():当Activity完全不可见时调用。
onDestroy():Activity即将被销毁时调用,此时应释放Activity所占用的资源。
二、页面布局
Android提供了多种布局方式来组织UI元素,包括线性布局(LinearLayout)、约束布局(ConstraintLayout)、表格布局(TableLayout)、帧布局(FrameLayout)和相对布局(RelativeLayout)等。每种布局都有其特定的使用场景和优势:

线性布局:将子视图按照水平或垂直方向排列。
约束布局:通过约束来定义子视图之间的关系,允许创建大型且复杂的布局,同时保持层次结构的扁平化。
表格布局:用于以行和列的形式组织界面,类似于HTML中的表格。
帧布局:用于存放单个子视图,通常用于包裹一个单独的子视图,特别是当需要在运行时替换界面元素时。
相对布局:子视图的位置是相对于布局或其他子视图的位置来确定的,提供了更大的灵活性。
三、弹窗
在Android中,弹窗通常用于向用户显示信息或获取用户的输入。常用的弹窗类型包括AlertDialog、Custom Dialog和PopupWindow等:

AlertDialog:用于显示一个简单的对话框,可以包含标题、消息、图标和按钮等。
Custom Dialog:当你需要更复杂的布局或功能时,可以创建一个自定义的Dialog。这通常涉及继承Dialog类或DialogFragment,并在其中定义自己的布局和行为。
PopupWindow:一个可以在当前活动上浮动的小窗口,不会自动管理生命周期,因此需要自己处理显示和隐藏。
四、页面跳转
在Android应用中,页面跳转通常通过Intent来实现。Intent是一个消息传递对象,它可以用于请求另一个应用组件执行指定的操作。使用Intent进行页面跳转时,需要在AndroidManifest.xml文件中注册目标Activity。Intent可以显式地指定目标组件,也可以隐式地根据动作(Action)和数据(Data)来匹配目标组件。

五、按钮的使用
按钮是Android应用中最常用的用户界面元素之一。它允许用户通过点击或触摸来触发操作。在Android中,按钮是通过使用Button类创建的。你可以在XML布局文件中使用标签来定义按钮,也可以在Java代码中通过调用Button类的构造函数来创建按钮。为了处理按钮点击事件,你需要为按钮设置点击事件监听器,并在监听器中编写相应的处理逻辑。

六、文本框的使用
文本框在Android开发中通常使用EditText控件来实现。EditText控件允许用户输入和编辑文本。你可以在XML布局文件中添加EditText控件,并设置其属性如宽度、高度、提示文本等。在Java代码中,你可以通过findViewById方法获取布局中定义的EditText控件,并获取用户输入的文本内容。此外,你还可以为EditText控件设置输入类型(如密码、数字等)、最大输入长度等属性,并为其添加文本改变监听器以便在文本改变时执行特定的操作。

综上所述,掌握以上基础知识是初学安卓开发的重要一步。通过不断学习和实践,你将能够逐步提高自己的安卓开发能力并开发出高质量的Android应用。

效果展示:

在这里插入图片描述

安卓例程3

核心代码:

主函数:

package com.example.test05;

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

import android.content.DialogInterface;
import android.content.Intent;
import android.os.Bundle;
import android.text.Editable;
import android.text.TextWatcher;
import android.view.View;
import android.widget.Button;
import android.widget.CheckBox;
import android.widget.EditText;
import android.widget.RadioButton;
import android.widget.RadioGroup;
import android.widget.TextView;
import android.widget.Toast;

import com.example.test05.util.ViewUtil;

import java.util.Random;

public class LoginMainActivity extends AppCompatActivity implements RadioGroup.OnCheckedChangeListener, View.OnClickListener {

    private TextView tv_password;
    private EditText et_password;
    private Button btn_forget;
    private CheckBox ck_remember;
    private EditText et_phone;
    private RadioButton rb_password;
    private RadioButton rb_verifycode;
    private static final int REQUEST_CODE = 1; // 定义请求码
    private Button btn_login;
    private String mPassword = "123456";
    private String mverifyCode;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_login_main);
        RadioGroup rb_login = findViewById(R.id.rg_login);
        tv_password = findViewById(R.id.tv_password);
        et_password = findViewById(R.id.et_password);
        et_phone = findViewById(R.id.et_phone);
        btn_forget = findViewById(R.id.btn_forget);
        ck_remember = findViewById(R.id.ck_remember);
        //给rg_login设置单选监听器
        rb_login.setOnCheckedChangeListener(this);
        //给et_phone添加文本变更监听器
        et_phone.addTextChangedListener(new HideTextWatcher(et_phone,11));
        et_password.addTextChangedListener(new HideTextWatcher(et_password,6));
        btn_forget.setOnClickListener(this);
        rb_password = findViewById(R.id.rb_password);
        rb_verifycode = findViewById(R.id.rb_verifycode);
        btn_login = findViewById(R.id.btn_login);
        btn_login.setOnClickListener(this);
    }

    @Override
    public void onCheckedChanged(RadioGroup group, int checkedId) {
        switch (checkedId){
            case R.id.rb_password:
                tv_password.setText(getString(R.string.login_password));
                et_password.setHint(getString(R.string.input_password));
                btn_forget.setText(getString(R.string.forget_password));
                ck_remember.setVisibility(View.VISIBLE);
                break;
            case R.id.rb_verifycode:
                tv_password.setText(getString(R.string.verifycode));
                et_password.setHint(getString(R.string.input_verifycode));
                btn_forget.setText(getString(R.string.get_verifycode));
                ck_remember.setVisibility(View.GONE);
                break;


        }
    }

    @Override
    public void onClick(View v) {
        String phone = et_phone.getText().toString();
        if(phone.length() < 11){
            Toast.makeText(this,"请输入正确的手机号码",Toast.LENGTH_SHORT).show();
            return;
        }

        switch (v.getId()){
            case R.id.btn_forget:
                if(rb_password.isChecked()){
                    Intent intent = new Intent(this ,LoginForgetActivity.class);
                    Bundle bundle = new Bundle();
                    bundle.putString("phone",phone );
                    intent.putExtras(bundle);
                    startActivityForResult(intent, REQUEST_CODE); // 传递intent和请求码
                }else if (rb_verifycode.isChecked()){
                    //生成六位随机的验证码
                    mverifyCode = String.format("%06d",new Random().nextInt(99999));
                    //弹出提醒对话框,提示用户记住六位验证码数字
                    AlertDialog.Builder builder = new AlertDialog.Builder(this);
                    builder.setMessage("手机号" + phone +"本次验证码是"+ mverifyCode  +"请输入验证码");
                    builder.setPositiveButton("haod",null);
                    AlertDialog dialog = builder.create();
                    dialog.show();
                }
                break;
            case R.id.btn_login:
                if(rb_password.isChecked()){
                    if(!mPassword.equals(et_password.getText().toString())){
                        Toast.makeText(this,"请输入你的密码",Toast.LENGTH_SHORT).show();
                        return;
                    }
                    //提示用户登录成功
                    loginSuccess();
                }else if(rb_verifycode.isChecked())
                    if(!mverifyCode.equals(et_password.getText().toString())){
                        Toast.makeText(this,"请输入正确的验证码",Toast.LENGTH_SHORT).show();
                        return;
                    }
                loginSuccess();
                break;
        }
    }

    private void loginSuccess() {
        String desc = String.format("你的手机号码%s",
                et_phone.getText().toString());
        AlertDialog.Builder builder = new  AlertDialog.Builder((this));
        builder.setTitle("登录成功");
        builder.setMessage(desc);
        builder.setPositiveButton("确定返回", new DialogInterface.OnClickListener() {
            @Override
            public void onClick(DialogInterface dialog, int which) {
                finish();
            }
        });
        builder.setNegativeButton("我再看看",null);
        AlertDialog dialog = builder.create();
        dialog.show();
    }

    private class HideTextWatcher implements TextWatcher {
        private  EditText mView;
        private  int mMaxLength;
        public HideTextWatcher(EditText v, int maxLength) {
            this.mView = v;
            this.mMaxLength = maxLength;
        }

        @Override
        public void beforeTextChanged(CharSequence s, int start, int count, int after) {

        }

        @Override
        public void onTextChanged(CharSequence s, int start, int before, int count) {

        }

        @Override
        public void afterTextChanged(Editable s) {
            String str = s.toString();
            if (str.length() ==  mMaxLength ){
                //隐藏输入法
                ViewUtil.hideOneIputMehod(LoginMainActivity.this,mView);
            }

        }
    }

布局文件

<?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:orientation="vertical">
    
    <RadioGroup
        android:id="@+id/rg_login"
        android:layout_width="match_parent"
        android:layout_height="@dimen/item_layout_height"
        android:orientation="horizontal">

    <RadioButton
        android:id="@+id/rb_password"
        android:layout_width="0dp"
        android:layout_height="match_parent"
        android:layout_weight="1"
        android:text="@string/login_by_password"
        android:textColor="@color/black"
        android:textSize="@dimen/common_font_size"/>

    <RadioButton
        android:id="@+id/rb_verifycode"
        android:layout_width="0dp"
        android:layout_height="match_parent"
        android:layout_weight="1"
        android:text="@string/login_by_verifycode"
        android:textColor="@color/black"
        android:textSize="@dimen/common_font_size" />
    </RadioGroup>

    <LinearLayout
        android:layout_width="match_parent"
        android:layout_height="@dimen/item_layout_height">

        <TextView
            android:layout_width="wrap_content"
            android:layout_height="match_parent"
            android:gravity="center"
            android:text="@string/phone_number"
            android:textColor="@color/black"
            android:textSize="@dimen/common_font_size"/>

        <EditText
            android:id="@+id/et_phone"
            android:layout_width="0dp"
            android:layout_weight="1"
            android:layout_height="match_parent"
            android:layout_marginTop="5dp"
            android:layout_marginBottom="5dp"
            android:hint="@string/input_phone_number"
            android:inputType="number"
            android:maxLength="11"
            android:textColor="@color/black"
            android:textColorHint="@color/grey"
            android:textSize="@dimen/common_font_size"/>
    </LinearLayout>

    <LinearLayout
        android:layout_width="match_parent"
        android:layout_height="@dimen/item_layout_height">

        <TextView
            android:id="@+id/tv_password"
            android:layout_width="wrap_content"
            android:layout_height="match_parent"
            android:gravity="center"
            android:text="@string/login_by_password"
            android:textColor="@color/black"
            android:textSize="@dimen/common_font_size"/>

        <RelativeLayout
            android:layout_width="0dp"
            android:layout_height="match_parent"
            android:layout_weight="1">

            <EditText
                android:id="@+id/et_password"
                android:layout_width="match_parent"
                android:layout_height="match_parent"
                android:layout_marginTop="5dp"
                android:layout_marginBottom="5dp"
                android:layout_weight="1"
                android:hint="@string/input_password"
                android:inputType="numberPassword"
                android:maxLength="11"
                android:textColor="@color/black"
                android:textColorHint="@color/grey"
                android:textSize="@dimen/common_font_size" />

            <Button
                android:id="@+id/btn_forget"
                android:layout_width="wrap_content"
                android:layout_height="match_parent"
                android:layout_alignParentEnd="true"
                android:text="@string/forget_password"
                android:layout_alignParentRight="true"
                android:textColor="@color/black"
                android:textColorHint="@color/grey"
                android:textSize="@dimen/common_font_size"/>

        </RelativeLayout>

    </LinearLayout>
    <CheckBox
        android:id="@+id/ck_remember"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:text="@string/remember_password"
        android:textColor="@color/black"
        android:textSize="@dimen/common_font_size"/>

    <Button
        android:id="@+id/btn_login"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:text="@string/login"
        android:textColor="@color/black"
        android:textSize="@dimen/button_font_size"/>

</LinearLayout>

网盘源码:

链接: https://pan.baidu.com/s/1ZrP6fHHl_QsPdExsaKnBgQ?pwd=nfrv 提取码: nfrv

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/904939.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

【牛客刷题实战】二叉树遍历

大家好&#xff0c;我是小卡皮巴拉 文章目录 目录 牛客题目&#xff1a; 二叉树遍历 题目描述 输入描述&#xff1a; 输出描述&#xff1a; 示例1 解题思路 问题理解 算法选择 具体思路 解题要点 完整代码&#xff08;C语言&#xff09; 兄弟们共勉 &#xff01;&…

多个项目同时进行,如何做好项目管理?

多项目管理相较于单一项目管理&#xff0c;要面临更大的挑战和难度。多项目管理需要同时管理和协调多个项目&#xff0c;使用项目管理工具可以帮助项目经理和团队成员更好地规划、执行和监控项目。以下是七款多项目管理软件&#xff0c;它们各具特色&#xff0c;能够满足不同项…

[vulnhub] Brainpan1

https://www.vulnhub.com/entry/brainpan-1,51/ 主机发现端口扫描 使用nmap扫描网段类存活主机 因为靶机是我最后添加的&#xff0c;所以靶机IP是166 nmap -sP 192.168.75.0/24 Starting Nmap 7.94SVN ( https://nmap.org ) at 2024-1…

Java避坑案例 - 线程池使用中的风险识别与应对

文章目录 线程池的基本概念创建线程池的注意事项实例1&#xff1a; newFixedThreadPool 使用无界队列&#xff0c;可能因任务积压导致 OOM实例2&#xff1a; newCachedThreadPool 会创建大量线程&#xff0c;可能因线程数量过多导致无法创建新线程。 线程池参数设置的最佳实践线…

Pytest-Bdd-Playwright 系列教程(5):仅执行测试用例的收集阶段

Pytest-Bdd-Playwright 系列教程&#xff08;5&#xff09;&#xff1a;仅执行测试用例的收集阶段 一、为什么需要仅收集测试用例二、应用场景三、方法详解【方法1】&#xff1a;添加pytest.ini文件的addopts配置项【方法2】&#xff1a;通过命令行参数运行 四、CI/CD 环境下的…

机器人技术基础(4章逆运动解算和雅克比矩阵)

逆运动解算&#xff1a; 雅克比矩阵&#xff1a; 将动力学分析转向运动的物体 下图中的 n o y 反映了机器人的姿态矩阵&#xff0c; 最后一列 p 反应了机器人在空间中的位置&#xff1a;

未来已来:人工智能赋能软件开发新篇章

引言 在数字化转型的浪潮中&#xff0c;数据已成为推动企业创新与增长的核心资产&#xff0c;而人工智能&#xff08;AI&#xff09;则是将这些数据转化为商业价值的关键动力。随着技术的迅速演进&#xff0c;AI 正逐步渗透到软件开发的各个环节&#xff0c;从需求预测到用户体…

C#实现视频会议录制(支持Windows、Linux、银河麒麟、统信UOS)

随着远程办公与异地协作越来越频繁&#xff0c;视频会议系统的使用也是越来越普遍。同时&#xff0c;用户对视频会议系统的功能也提出了更高的要求&#xff0c;比如&#xff0c;其中之一就是希望可以将整个视频会议的过程录制下来&#xff0c;以备之后可以查阅观看。 我们可以…

树莓派开发相关知识四 传感器-温湿度传感器

1、概述 使用DHT11温湿度传感器&#xff0c;传感周期为1s。 DHT11模块一般由3/4个引脚组成&#xff0c;每一次收集数据为40bit。 分别为&#xff1a; 高位在前、8bit湿度整数数据8bit湿度小数数据8bi温度整数数据8bit温度小数数据8bit校验和 我们需要解决的问题&#xff0c;…

vue3+less使用主题定制(多主题定制)可切换主题

假如要使用两套主题&#xff1a;蓝色、红色 例如&#xff1a; 首先确保自己的vue3项目有less&#xff0c;这边不多做接入解释 1、在src目录下建一个styles文件夹&#xff0c;在syles文件夹下面新建两个less文件&#xff1a;theme.less和variables.less&#xff1b; theme.le…

Spring Cloud Sleuth(Micrometer Tracing +Zipkin)

分布式链路追踪 分布式链路追踪技术要解决的问题&#xff0c;分布式链路追踪&#xff08;Distributed Tracing&#xff09;&#xff0c;就是将一次分布式请求还原成调用链路&#xff0c;进行日志记录&#xff0c;性能监控并将一次分布式请求的调用情况集中展示。比如各个服务节…

春季测试 2023 我的题解

T1 涂色游戏 这道题目还是比较简单的 容易发现&#xff0c;位于 ( x i , y i ) (x_i,y_i) (xi​,yi​) 的格子的颜色只取决于 ​ x i x_i xi​ 行与 y i y_i yi​ 列的颜色。 这时候可以想到开两个数组&#xff0c;分别存储列与行的绘画信息&#xff0c;然后发现前后的互相…

Kali Linux 新工具推荐: Sploitscan

在 2024.2 版本 Kali Linux 增加了一个新攻击工具: Sploitscan 1.简介: Sploitscan 能够发现操作系统和应用程序中的安全漏洞。 2.特点: 简单的命令行界面 扫描多个操作系统和应用程序 检测多种漏洞 提供详细信息 可定制性强 3.示例: 2024.2 及以后的版本 Kali Linux…

【JAVA 笔记】09 ch06_arrays_sort_and_search

第6章 数组、排序和查找 数组介绍 数组的使用 使用方式1-动态初始化数组的定义 使用方式2-动态初始化 使用方式3-静态初始化 数组使用注意事项和细节 数组应用案例 数组赋值机制 数组拷贝 数组添加/扩容 多维数组 二维数组 动态初始化1 动态初始化2 静态初始化 二维数组的应用案…

C语言实现归并排序

#include <stdio.h> #include <stdlib.h> #include<time.h> #include<string.h> #define N 7 // 定义元素类型为整型 typedef int ElemType; // 定义静态表结构体 typedef struct{ ElemType *elem; // 动态分配的数组指针 int TableL…

第十八章 Vue组件样式范围配置之scoped

目录 一、引言 二、案例演示 2.1. 工程结构图 2.2. 核心代码 2.2.1. main.js 2.2.2. App.vue 2.2.3. BaseOne.vue 2.2.4. BaseTwo.vue 2.3. 运行效果 2.4. 调整代码 2.4.1. BaseTwo.vue 2.4.2. 运行效果 三、scoped原理 一、引言 前面的几个章节在介绍组件的时…

Linux 中,flock 对文件加锁

在Linux中&#xff0c;flock是一个用于对文件加锁的实用程序&#xff0c;它可以帮助协调多个进程对同一个文件的访问&#xff0c;避免出现数据不一致或冲突等问题。以下是对flock的详细介绍&#xff1a; 基本原理 flock通过在文件上设置锁来控制多个进程对该文件的并发访问。…

stm32入门教程-- DMA数据转运

目录 简介 原理 实验示例 1、DMA数据转运 实现代码 实验效果 原理 实验示例 1、DMA数据转运 接线图 存储器映像 我们在开始代码之前&#xff0c;可以看下我们定义的数据&#xff0c;到底是不是真的存储在了这个相应的地址区间里&#xff0c;我们看代码&#xff1a; …

SELS-SSL/TLS

一、了解公钥加密&#xff08;非对称加密&#xff09; 非对称加密中&#xff0c;用于加密数据的密钥与用于解密数据的密钥不同。私钥仅所有者知晓&#xff0c;而公钥则可自由分发。发送方使用接收方的公钥对数据进行加密&#xff0c;数据仅能使用相应的私钥进行解密。 你可以将…

【Kettle的安装与使用】使用Kettle实现mysql和hive的数据传输(使用Kettle将mysql数据导入hive、将hive数据导入mysql)

文章目录 一、安装1、解压2、修改字符集3、启动 二、实战1、将hive数据导入mysql2、将mysql数据导入到hive 一、安装 Kettle的安装包在文章结尾 1、解压 在windows中解压到一个非中文路径下 2、修改字符集 修改 spoon.bat 文件 "-Dfile.encodingUTF-8"3、启动…