Android开发之项目实例(登录,注册)

article/2025/1/9 17:09:45

Android开发 实现登录注册界面

前言:

今天项目刚刚做完,我就迫不急待的想分享一下,自己通过实例项目踩过的坑以及遇到遇到的困难发表一下,以便刚刚接触的伙伴跳跳坑,也便于自己在今后的开发中巩固,此篇文章特别适合刚刚接触安卓开发的小白,有不同意见者也可以说说自己的想法,后续会将后续的功能更新,好了废话不多说,我们开干。

android登录功能实现

页面实现,这里主要用到线性布局,TextView组件,EditText组件,以及Button主键以及权重,小编在这多句嘴哈,权重主要解决屏幕适配的问题,众所周知手机的屏幕尺寸大小不一,因此利用权重来解决适配的问题,但还有其他的办法,对小编来说目前就使用权重 android:layout_weight="8"
界面的美观全靠自己的审美设计来定的,所以界面的美观,全靠大家的知识面,来完成更炫酷的界面

okhtttp转载资源
权重的相关资源转载于


<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"xmlns:tools="http://schemas.android.com/tools"android:layout_width="match_parent"android:layout_height="match_parent"android:orientation="vertical"tools:context=".ui.login.Login"><LinearLayoutandroid:layout_width="match_parent"android:layout_height="match_parent"android:orientation="vertical"android:padding="20dp"><LinearLayoutandroid:layout_width="match_parent"android:layout_height="wrap_content"android:orientation="vertical"><TextViewandroid:layout_width="match_parent"android:layout_height="wrap_content"android:gravity="center"android:text="登录"android:textColor="#000000"android:textSize="40sp"></TextView><TextViewandroid:layout_width="match_parent"android:layout_height="wrap_content"android:layout_marginTop="30dp"android:gravity="center"android:text="欢迎来到登录页面"android:textColor="#000000"android:textSize="25dp"></TextView></LinearLayout><LinearLayoutandroid:layout_width="match_parent"android:layout_height="wrap_content"android:layout_marginTop="200dp"android:orientation="horizontal"><TextViewandroid:id="@+id/textView"android:layout_width="0dp"android:layout_height="wrap_content"android:layout_weight="3"android:text="手机号:"android:textSize="20sp" /><EditTextandroid:id="@+id/phone"android:layout_width="0dp"android:layout_height="wrap_content"android:layout_weight="8"android:ems="10"android:hint="请输入你的手机号"android:inputType="textPersonName" /></LinearLayout><LinearLayoutandroid:layout_width="match_parent"android:layout_height="wrap_content"android:orientation="horizontal"><TextViewandroid:id="@+id/textView2"android:layout_width="0dp"android:layout_height="wrap_content"android:layout_weight="3"android:text="密码:"android:textSize="20sp"/><EditTextandroid:id="@+id/password"android:layout_width="0dp"android:layout_height="wrap_content"android:layout_weight="8"android:ems="10"android:hint="请输入你的密码"android:inputType="textPassword" /></LinearLayout><LinearLayoutandroid:layout_width="match_parent"android:layout_height="wrap_content"android:layout_marginTop="30dp"android:orientation="vertical"><Buttonandroid:id="@+id/log_but"android:layout_width="match_parent"android:layout_height="wrap_content"android:background="@drawable/circular_moment"android:text="登录"android:textColor="#ffffff"android:textSize="20dp" /><Buttonandroid:id="@+id/register"android:layout_width="match_parent"android:layout_height="wrap_content"android:layout_marginTop="20dp"android:background="@drawable/circular_moment"android:text="注册"android:textColor="#ffffff"android:textSize="20dp" /></LinearLayout></LinearLayout>
</LinearLayout>

shape资源转载

圆矩:制作
<shape xmlns:android="http://schemas.android.com/apk/res/android"android:shape="rectangle"><!-- rectangle表示为矩形 --><!-- 填充的颜色 --><solid android:color="#03A9F4" /><!-- 边框的颜色和粗细 --><strokeandroid:width="1dp"android:color="#989898"/><!-- android:radius 圆角的半径 --><cornersandroid:radius="20dp"/></shape>

登录功能实现分析:

根据项目要求,我们需要从后端取数据来匹配进行登录认证,因此,大家会想到我们怎么测呢?用什么来发起网络请求和响应呢?拿到数据又该怎么用呢?刚刚接触的伙伴是不是都跟我的想法,差不多呢?
现在,我就根据自己在实际操作中的想法一一给大家分析。
怎么测试?我们可以通过Postman这款工具来实现测试
这个是一个简单的登录接口
以上就是接口所给的参数,通过测试,会返回json键值对,并且大家要分清自己的什么是json对象,什么是json数组, { }这种形式的就是对象 [ ] 这个款式的就是数组 一般我遇到对象 就是一个JSONObject解析 遇到数组就JSONArray

首先,我们要在 AndroidManifest.xml添加网络权限

 <uses-permission android:name="android.permission.INTERNET" />

其次,初始化组件对象

 private EditText phone;//账号private EditText password;//密码private Button loginBut;//登录private Button registerBut;//注册

根据自己运用的组件来,然后我们需要找到组件组件对应的ID,也可以理解为赋值吧。。。。

 phone =  findViewById(R.id.phone);password =  findViewById(R.id.password);loginBut =  findViewById(R.id.log_but);registerBut =  findViewById(R.id.register);

接下来,我们要做一件有意义的事情,完成登录事件处理,以下来完成登录事件监听,就是可以理解为当点击登录按钮的时候,要发生些什么有趣的事件,比如跳转页面,获取其他的根据项目需求而来。

 loginBut.setOnClickListener(new View.OnClickListener() {@Overridepublic void onClick(View view) {}});

由于,用户登录的时候,咱们需要向服务器发起请求,因此我们又需要用到okHttp,这些个东西都是开源的也可以自己去官网下载,也可以去build.gradle 添加,来进行缓存

implementation 'com.squareup.okhttp3:okhttp:3.4.1'

接下来,我们就要做这个事件的核心,就是把数据转换为json键值对来提交到服务器进行匹配,配对成功了,那就登录成功:

Login完成代码
package com.fall.project.ui.login;import android.content.Context;
import android.content.Intent;
import android.content.SharedPreferences;
import android.os.Bundle;
import android.util.Log;
import android.view.View;
import android.view.WindowManager;
import android.widget.Button;
import android.widget.EditText;
import android.widget.Toast;import androidx.appcompat.app.ActionBar;
import androidx.appcompat.app.AppCompatActivity;import com.fall.project.R;
import com.fall.project.ui.Index.Index;
import com.fall.project.ui.register.Register;import org.json.JSONException;
import org.json.JSONObject;import java.io.IOException;import okhttp3.MediaType;
import okhttp3.OkHttpClient;
import okhttp3.Request;
import okhttp3.RequestBody;
import okhttp3.Response;public class Login extends AppCompatActivity {private EditText phone;//账号private EditText password;//密码private Button loginBut;//登录private Button registerBut;//注册@Overrideprotected void onCreate(final Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.login);//隐藏标题栏ActionBar actionBar = getSupportActionBar();actionBar.hide();//赋值phone =  findViewById(R.id.phone);password =  findViewById(R.id.password);loginBut =  findViewById(R.id.log_but);registerBut =  findViewById(R.id.register);//登录点击事件loginBut.setOnClickListener(new View.OnClickListener() {@Overridepublic void onClick(View view) {if (phone.getText().toString().equals("")){Toast.makeText(Login.this,"手机号不能为空",Toast.LENGTH_SHORT).show();return;}if (password.getText().toString().equals("")){Toast.makeText(Login.this,"密码不能为空",Toast.LENGTH_SHORT).show();return;}//开启线程发起网络请求new Thread(new Runnable() {@Overridepublic void run() {MediaType JSON=MediaType.parse("application/json;charset=utf-8");JSONObject json=new JSONObject();//创建一个json键值对try {json.put("phone",phone.getText());//输入框输入的数据json.put("password",password.getText());} catch (JSONException e) {e.printStackTrace();}//拿到OkHttpClient对象OkHttpClient client=new OkHttpClient();RequestBody requestBody=RequestBody.create(JSON,String.valueOf(json));Request request=new Request.Builder().url("http://150.158.117.228:8000/login").post(requestBody)//因为项目要求是post请求,因此我们要遵循规则,post请,默认或者  .get 就是get请求.build();try {Response response=client.newCall(request).execute();String responseData=response.body().string();Log.e( "run: TAG",responseData );//解析  jsonString code=new JSONObject(responseData).getString("code");if (code.equals("200")){runOnUiThread(new Runnable() {@Overridepublic void run() {Toast.makeText(Login.this,"登录成功",Toast.LENGTH_SHORT).show();}});JSONObject dataJson=new JSONObject(responseData).getJSONObject("data");SharedPreferences.Editor editor=getSharedPreferences("users",MODE_PRIVATE).edit();//通过SharedPreferences  把服务器返回的数据进行存储,以便于后期使用      editor.putString("nickName",dataJson.getString("nickName"));editor.putString("phone",dataJson.getString("phone"));editor.putString("age",dataJson.getString("age"));editor.putString("gender",dataJson.getString("gender"));editor.putString("balance",dataJson.getString("balance"));editor.commit();//提交Intent intent=new Intent(Login.this, Index.class);startActivity(intent);}} catch (IOException | JSONException e) {e.printStackTrace();}}}).start();}});//注册点击事件registerBut.setOnClickListener(new View.OnClickListener() {@Overridepublic void onClick(View view) {Intent registerIntent = new Intent(Login.this, Register.class);startActivity(registerIntent);}});}
}

由于登录和注册思路一样,我在这直接上代码

注册   XML  
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"xmlns:tools="http://schemas.android.com/tools"android:layout_width="match_parent"android:layout_height="match_parent"tools:context=".ui.register.Register"android:orientation="vertical"><LinearLayoutandroid:layout_width="match_parent"android:layout_height="match_parent"android:orientation="vertical"android:padding="20dp"><TextViewandroid:layout_width="match_parent"android:layout_height="wrap_content"android:gravity="center"android:text="注册"android:textColor="#000000"android:textSize="40sp"></TextView><TextViewandroid:layout_width="match_parent"android:layout_height="wrap_content"android:layout_marginTop="30dp"android:gravity="center"android:text="欢迎来到注册页面"android:textColor="#000000"android:textSize="25dp"></TextView><LinearLayoutandroid:layout_width="match_parent"android:layout_height="wrap_content"android:orientation="horizontal"android:layout_marginTop="100dp"android:padding="10dp"><TextViewandroid:id="@+id/textView"android:layout_width="0dp"android:layout_height="wrap_content"android:layout_weight="3"android:text="昵称:"android:textSize="20sp" /><EditTextandroid:id="@+id/nickName"android:layout_width="0dp"android:layout_height="wrap_content"android:layout_weight="8"android:ems="10"android:inputType="text" /></LinearLayout><LinearLayoutandroid:layout_width="match_parent"android:layout_height="wrap_content"android:orientation="horizontal"android:padding="10dp"><TextViewandroid:layout_width="0dp"android:layout_height="wrap_content"android:layout_weight="3"android:text="手机号:"android:textSize="20sp" /><EditTextandroid:id="@+id/rephone"android:layout_width="0dp"android:layout_height="wrap_content"android:layout_weight="8"android:ems="10"android:inputType="number" /></LinearLayout><LinearLayoutandroid:layout_width="match_parent"android:layout_height="wrap_content"android:orientation="horizontal"android:padding="10dp"><TextViewandroid:id="@+id/textView2"android:layout_width="0dp"android:layout_height="wrap_content"android:layout_weight="3"android:text="年龄:"android:textSize="20sp"/><EditTextandroid:id="@+id/age"android:layout_width="0dp"android:layout_height="wrap_content"android:layout_weight="8"android:ems="10"android:inputType="number" /></LinearLayout><LinearLayoutandroid:layout_width="match_parent"android:layout_height="wrap_content"android:orientation="horizontal"android:padding="10dp"><TextViewandroid:layout_width="0dp"android:layout_height="wrap_content"android:layout_weight="3"android:text="性别:"android:textSize="20sp"/><EditTextandroid:id="@+id/gender"android:layout_width="0dp"android:layout_height="wrap_content"android:layout_weight="8"android:ems="10"android:inputType="text" /></LinearLayout><LinearLayoutandroid:layout_width="match_parent"android:layout_height="wrap_content"android:orientation="horizontal"android:padding="10dp"><TextViewandroid:layout_width="0dp"android:layout_height="wrap_content"android:layout_weight="3"android:text="密码:"android:textSize="20sp"/><EditTextandroid:id="@+id/repassword"android:layout_width="0dp"android:layout_height="wrap_content"android:layout_weight="8"android:ems="10"android:inputType="textPassword" /></LinearLayout><Buttonandroid:id="@+id/register"android:layout_width="match_parent"android:layout_height="wrap_content"android:layout_marginTop="30dp"android:background="@drawable/circular_moment"android:text="立即注册"android:textColor="#ffffff"android:textSize="20dp" /><TextViewandroid:id="@+id/text_fh"android:layout_width="match_parent"android:layout_height="wrap_content"android:gravity="center"android:text="已有账号,返回登录"android:textColor="#F44336"android:textSize="20dp"></TextView></LinearLayout>
</LinearLayout>

完整主方法代码如下:
package com.fall.project.ui.register;import android.content.Intent;
import android.content.SharedPreferences;
import android.os.Bundle;
import android.util.Log;
import android.view.View;
import android.widget.Button;
import android.widget.EditText;
import android.widget.TextView;
import android.widget.Toast;import androidx.appcompat.app.ActionBar;
import androidx.appcompat.app.AppCompatActivity;import com.fall.project.R;
import com.fall.project.ui.login.Login;import org.json.JSONException;
import org.json.JSONObject;import java.io.IOException;import okhttp3.MediaType;
import okhttp3.OkHttpClient;
import okhttp3.Request;
import okhttp3.RequestBody;
import okhttp3.Response;public class Register extends AppCompatActivity {private EditText nickName;//昵称private EditText phone;//手机号private EditText age;//年龄private EditText gender;//性别private EditText password;//密码private Button registerBut;//立即注册private TextView loginTtV;//返回登录@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.register);//隐藏标题栏ActionBar actionBar = getSupportActionBar();actionBar.hide();nickName = (EditText) findViewById(R.id.nickName);phone = (EditText) findViewById(R.id.rephone);age = (EditText) findViewById(R.id.age);gender = (EditText) findViewById(R.id.gender);password = (EditText) findViewById(R.id.repassword);registerBut = (Button) findViewById(R.id.register);loginTtV = (TextView) findViewById(R.id.text_fh);//注册事件处理registerBut.setOnClickListener(new View.OnClickListener() {@Overridepublic void onClick(View view) {if (nickName.getText().toString().equals("")) {Toast.makeText(Register.this, "用户昵称不能为空", Toast.LENGTH_SHORT).show();return;}if (phone.getText().toString().equals("")) {Toast.makeText(Register.this, "用户手机号不能为空", Toast.LENGTH_SHORT).show();return;}if (age.getText().toString().equals("")) {Toast.makeText(Register.this, "用户年龄不能为空", Toast.LENGTH_SHORT).show();return;}if (gender.getText().toString().equals("")) {Toast.makeText(Register.this, "用户性别不能为空", Toast.LENGTH_SHORT).show();return;}if (password.getText().toString().equals("")) {Toast.makeText(Register.this, "用户密码不能为空", Toast.LENGTH_SHORT).show();return;}//开启线程发起网络请求 ,并且请求仅限于子线程发起。new Thread(new Runnable() {@Overridepublic void run() {MediaType JSON = MediaType.parse("application/json;charset=utf-8");JSONObject json = new JSONObject();try {json.put("phone", phone.getText());json.put("password", password.getText());json.put("nickName", nickName.getText());json.put("age", age.getText());json.put("gender", gender.getText());} catch (JSONException e) {e.printStackTrace();}//拿到OkHttpClient对象OkHttpClient client = new OkHttpClient();//创建一个RequestBody(参数1:数据类型 参数2:传递的json串)RequestBody requestBody = RequestBody.create(JSON, String.valueOf(json));//3.构建request,将FormBody作为post方法的参数传入Request request = new Request.Builder().url("http://150.158.117.228:8000/reg").post(requestBody).build();try {Response response = client.newCall(request).execute();String responseData = response.body().string();Log.e("run: TAG", responseData);String code = new JSONObject(responseData).getString("code");if (code.equals("200")) {//runOnUiThread(new Runnable()从子线程跳入主线程runOnUiThread(new Runnable() {@Overridepublic void run() {Toast.makeText(Register.this, "注册成功", Toast.LENGTH_SHORT).show();}});Intent intent = new Intent(Register.this, Login.class);startActivity(intent);}} catch (IOException | JSONException e) {e.printStackTrace();}}}).start();}});//返回事件处理loginTtV.setOnClickListener(new View.OnClickListener() {@Overridepublic void onClick(View view) {Intent registerIntent = new Intent(Register.this, Login.class);startActivity(registerIntent);}});}
}

总结:登录,注册功能运用到的知识点,也就是 okhttp 发起网卡请求和响应,以及json的提交和取值, 通过SharedPreferences 把服务器返回的数据进行本地存取.


http://chatgpt.dhexx.cn/article/nNKvMqQw.shtml

相关文章

Django新手项目实例

1. 程序安装 &#xff08;1&#xff09;安装Django&#xff1a; pip3 install django&#xff08;2&#xff09;配置系统环境 成功安装Django后&#xff0c;在python目录script路径可找到django-admin.exe文件&#xff0c;将它加入操作系统环境变量中。这样以后调用会比较方便…

微信小程序项目实例——印记

微信小程序项目实例——印记 文章目录 微信小程序项目实例——印记一、项目展示二、日记列表三、日记发布文末 项目代码见文字底部&#xff0c;点赞关注有惊喜 一、项目展示 印记是一款简洁便利的日记本&#xff0c;用户可以在其中发布自己的日记本&#xff0c;同时也可以查看…

微信小程序项目实例——备忘录

微信小程序项目实例——备忘录 文章目录 微信小程序项目实例——备忘录一、项目展示二、项目介绍三、核心代码 项目代码见文字底部&#xff0c;点赞关注有惊喜 一、项目展示 二、项目介绍 项目是一个备忘录&#xff0c;拥有记录文字、计时和提醒的基本功能 项目只有一个页面&…

微信小程序项目实例——幸运大转盘

微信小程序项目实例——幸运大转盘 文章目录 微信小程序项目实例——幸运大转盘一、项目展示二、抽奖页三、领奖页文末&#xff1a;项目代码 项目代码见文字底部&#xff0c;点赞关注有惊喜 一、项目展示 幸运大转盘是一个简单的抽奖小程序 参与用户点击抽奖便可抽取轮盘的奖品…

微信小程序项目实例——狼人杀

微信小程序项目实例——狼人杀 文章目录 微信小程序项目实例——狼人杀一、项目展示二、首页三、游戏页四、特殊角色文末 项目代码见文字底部&#xff0c;点赞关注有惊喜 一、项目展示 狼人杀是一款多人参与的&#xff0c;通过语言描述推动、较量口才和分析判断能力的策略类桌…

project实操——项目实例

1. 新建项目 2. 设置项目日历 可以设置每周工作几天&#xff0c;每天工作几小时 点击 项目 -> 更改工作时间 在弹出窗口上&#xff0c;选择下方的“”工作周“选项卡&#xff0c;点击右侧的【详细信息】按钮 系统打开的详细信息窗口上&#xff0c; 选中左侧列表中的“周六…

Android Studio同步远程Git代码到本地

前一篇文件说如何将本地代码同步到远程Git服务器&#xff08;将代码同步到远程Git服务器&#xff09;&#xff0c;这篇说说如何在Android Studio中将远程代码同步到本地。 环境说明&#xff1a; 1、本地需要安装有git环境 2、Android Studio 3、存放项目的远程服务器地址&a…

git 同步远程和本地的同名分支

首先正常创建一个本地仓库&#xff0c;添加内容&#xff0c;跟远程关联 git init git add . git commit -m "" git remote add origin 远程仓库地址 如果在本地创建了一个新的分支 git checkout -b branch_one 然后将该分支直接推动到远程进行同步 git push -u …

使用git 实现本地文件和远程代码仓的互相同步

一、关于Git的安装与配置&#xff0c;可以参考这两篇文章 Git 详细安装教程&#xff08;详解 Git 安装过程的每一个步骤&#xff09; GitHub的安装与配置 二、同步本地文件与代码仓常规流程 1、在github上创建项目2、使用git clone https://github.com/xxxxxxx/xxxxx.git 克…

git(实现代码存档和同步)

远程仓库就是github&#xff0c;码云这些之类的&#xff0c;所有人都以远程仓库的文件作为最新版本 每个人都有自己的工作区&#xff08;本地电脑里面的一个文件夹&#xff09;&#xff0c;每个人都可以用clone把最新版本的文件复制到本地 比如我现在有四个文件&#xff0c;但…

[Git] 本地代码库和远程同步

一 前言 这本来不是一个很严重的问题, 有很多办法可以处理, 但是对于Git新手来说, 会觉得非常可怕, 因为不知道怎么恢复之前的状态, 不知道当前状态上传上去会造成什么影响, 最怕的是影响到master之类的主分支, 然后把别人的工作搞丢, 那就完蛋了. 我刚开始接触Git的时候, 上…

git操作之同步代码到仓库

1、先创建一个仓库&#xff0c;然后把创建的空仓库克隆到本地&#xff1b;2、把程序拷贝到本地的仓库中&#xff0c;然后再进行下列操作&#xff1b;&#xff08;1&#xff09;git add . 保存全部内容&#xff08;2&#xff09;git commit -m "项目描述"(3) git pu…

如何将git服务器同步到本地文件夹,使用git在服务器上部署git仓库并实现提交代码时同步代码到生产环境...

最近由于需要对正在运行的系统进行新功能添加&#xff0c;本来是可以通过github进行代码维护&#xff0c;但是由于这个项目涉及一些问题&#xff0c;目前还不能开源&#xff0c;所以只能是手动覆盖bug文件&#xff0c;生产环境上的代码反而是最新的了。 之前有个思路&#xff0…

git 项目代码上传到服务器上,git 上传代码到服务器

一、建立本地git仓库 1、cd到你项目根目录下 git init 二、将本地所有文件添加到暂存区 git add . . 表示所有文件 如果想添加项目中的指定文件,那就把.改为指定文件名或者目录即可,多个目录用空格隔开 三、将暂存区的文件提交到本地仓库 git commit -m 注释 四、在码云上创建…

git如何拉去开发的 最新代码_git拉取代码到本地

git拉取代码到本地的方法是:首先打开git命令窗口,输入命令【git clone github仓库地址】;然后回车即可拉取代码到本地仓库。 第一步:拉取远程代码git clone https://github.com/…/PrettyGirls.git 第二步:查看本地分支和远程分支1、cd PrettyGirls 到工程目录下; 2、git…

git配置及同步项目代码到本地

长久不用git发现自己都忘记了。。。在此记录下git配置&#xff0c;以便日后查看。 git配置 配置本地仓库账号和邮箱 git config --global user.name "YourName" git config --global user.email "your-emailexample.com"生成ssh密钥 ssh-keygen -t rsa -…

Git克隆仓库代码至本地

目录 1、本地新建文件夹&#xff1a; 2、文件夹右击&#xff0c;点击&#xff1a;Git Bash Here 3、本地仓库初始化&#xff0c;输入&#xff1a;git init 4、复制仓库代码地址 5、代码克隆&#xff0c;输入&#xff1a;git clone 复制的地址 6、打开文件夹&#xff0c;…

Git代码拉取与同步

1、git clone [email protected]:xxx/xxx.git 2、git checkout -b dev origin/dev 创建本地dev分支 并与远程dev分支关联 3、git remote add upstream 远程公库地址 关联到远程的公库 4、git pull upstream dev 从远程公库拉取dev分支代码 远程公库新建了bug分支&#xff…

在WebStorm里面搜索文件中出现的中文字符

ctrfF或者ctflshiftF 搜索[\u0100-\uffff]

处理webStorm中文字体样式大小不一,难看的问题

修改前样式&#xff1a; 修改后样式&#xff1a; 具体操作设置如下: File→Settings→Appearance & Behavior→Appearance&#xff0c;Theme 选择Darcula&#xff08;主题可自行选择&#xff09; File→Settings→Editor→Font&#xff0c; Font 选择Consolas&#xff…