【Android】家庭记账本手机版开发报告五
一、说在前面
| 昨天 |
1、添加菜单(查询、清除所有等)2、使用滑动删除 |
| 今天 |
1、创建登入和注册界面 2、向数据库添加一张用户表 |
| 问题 | 做完后在登入时有bug(未解决) |
二、界面的搭建
1、登入界面

2、登入界面的代码(粗糙版)
<?xml version="1.0" encoding="utf-8"?>
<androidx.constraintlayout.widget.ConstraintLayout 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/frameLayout"
android:layout_width="match_parent"
android:layout_height="match_parent"
tools:context=".loginFragment" > <androidx.constraintlayout.widget.Guideline
android:id="@+id/guideline4"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:orientation="vertical"
app:layout_constraintGuide_percent="0.9" /> <androidx.constraintlayout.widget.Guideline
android:id="@+id/guideline6"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:orientation="vertical"
app:layout_constraintGuide_percent="0.1" /> <TextView
android:id="@+id/textView2"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="@string/title_text"
android:textSize="@dimen/title_font"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintEnd_toStartOf="@+id/guideline4"
app:layout_constraintHorizontal_bias="0.5"
app:layout_constraintStart_toStartOf="@+id/guideline6"
app:layout_constraintTop_toTopOf="parent"
app:layout_constraintVertical_bias="0.05" /> <ImageView
android:id="@+id/imageView"
android:layout_width="175dp"
android:layout_height="174dp"
android:contentDescription="@string/dec"
android:src="@drawable/login"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintDimensionRatio="w,1:1"
app:layout_constraintEnd_toStartOf="@+id/guideline4"
app:layout_constraintStart_toStartOf="@+id/guideline6"
app:layout_constraintTop_toTopOf="parent"
app:layout_constraintVertical_bias="0.2" /> <EditText
android:id="@+id/editTextusername"
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_marginStart="8dp"
android:layout_marginLeft="8dp"
android:layout_marginEnd="8dp"
android:layout_marginRight="8dp"
android:ems="10"
android:hint="@string/username"
android:importantForAutofill="no"
android:inputType="textPersonName"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintEnd_toStartOf="@+id/guideline4"
app:layout_constraintStart_toStartOf="@+id/guideline6"
app:layout_constraintTop_toTopOf="parent"
app:layout_constraintVertical_bias="0.5" /> <EditText
android:id="@+id/editTextpassword"
android:layout_width="0dp"
android:layout_height="wrap_content"
android:ems="10"
android:hint="@string/password"
android:importantForAutofill="no"
android:inputType="textPassword"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintEnd_toEndOf="@+id/editTextusername"
app:layout_constraintStart_toStartOf="@+id/editTextusername"
app:layout_constraintTop_toTopOf="parent"
app:layout_constraintVertical_bias="0.6" /> <Button
android:id="@+id/buttonlogin"
android:layout_width="0dp"
android:layout_height="wrap_content"
android:text="@string/login"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintEnd_toEndOf="@+id/editTextusername"
app:layout_constraintHorizontal_bias="0.5"
app:layout_constraintStart_toStartOf="@+id/editTextusername"
app:layout_constraintTop_toTopOf="parent"
app:layout_constraintVertical_bias="0.7" /> <Button
android:id="@+id/buttonregister"
android:layout_width="0dp"
android:layout_height="wrap_content"
android:text="@string/button_registe"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintEnd_toEndOf="@+id/editTextusername"
app:layout_constraintStart_toStartOf="@+id/editTextusername"
app:layout_constraintTop_toTopOf="parent"
app:layout_constraintVertical_bias="0.8" />
</androidx.constraintlayout.widget.ConstraintLayout>
3、注册界面

4、注册界面代码
<?xml version="1.0" encoding="utf-8"?>
<androidx.constraintlayout.widget.ConstraintLayout 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/frameLayout2"
android:layout_width="match_parent"
android:layout_height="match_parent"
tools:context=".UserAddFragment"> <TextView
android:id="@+id/textView6"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="@string/user_add_tltle"
android:textSize="@dimen/title_font"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintEnd_toStartOf="@+id/guideline10"
app:layout_constraintHorizontal_bias="0.5"
app:layout_constraintStart_toStartOf="@+id/guideline9"
app:layout_constraintTop_toTopOf="parent"
app:layout_constraintVertical_bias="0.15" /> <androidx.constraintlayout.widget.Guideline
android:id="@+id/guideline9"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:orientation="vertical"
app:layout_constraintGuide_percent="0.1" /> <androidx.constraintlayout.widget.Guideline
android:id="@+id/guideline10"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:orientation="vertical"
app:layout_constraintGuide_percent="0.9" /> <EditText
android:id="@+id/editTextU"
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_marginStart="16dp"
android:layout_marginLeft="16dp"
android:layout_marginEnd="16dp"
android:layout_marginRight="16dp"
android:ems="10"
android:hint="@string/user_add_username"
android:inputType="textPersonName"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintEnd_toStartOf="@+id/guideline10"
app:layout_constraintHorizontal_bias="1.0"
app:layout_constraintStart_toStartOf="@+id/guideline9"
app:layout_constraintTop_toTopOf="parent"
app:layout_constraintVertical_bias="0.3"
android:importantForAutofill="no" /> <EditText
android:id="@+id/editTextP"
android:layout_width="0dp"
android:layout_height="wrap_content"
android:ems="10"
android:hint="@string/user_add_password"
android:inputType="textPassword"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintEnd_toEndOf="@+id/editTextU"
app:layout_constraintStart_toStartOf="@+id/editTextU"
app:layout_constraintTop_toTopOf="parent"
app:layout_constraintVertical_bias="0.45"
android:importantForAutofill="no" /> <EditText
android:id="@+id/editTextRP"
android:layout_width="0dp"
android:layout_height="wrap_content"
android:ems="10"
android:hint="@string/user_add_repressword"
android:inputType="textPassword"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintEnd_toEndOf="@+id/editTextP"
app:layout_constraintStart_toStartOf="@+id/editTextP"
app:layout_constraintTop_toTopOf="parent"
app:layout_constraintVertical_bias="0.6"
android:importantForAutofill="no" /> <Button
android:id="@+id/buttonR"
android:layout_width="0dp"
android:layout_height="wrap_content"
android:text="@string/button_registe"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintEnd_toEndOf="@+id/editTextU"
app:layout_constraintHorizontal_bias="0.497"
app:layout_constraintStart_toStartOf="@+id/editTextU"
app:layout_constraintTop_toTopOf="parent"
app:layout_constraintVertical_bias="0.75" />
</androidx.constraintlayout.widget.ConstraintLayout>
二、用户表的创建
1、实体(User.java)
package com.me.familybookkeepingbook; import androidx.room.ColumnInfo;
import androidx.room.Entity;
import androidx.room.PrimaryKey; @Entity
public class User {
@PrimaryKey(autoGenerate = true)
private int id;
@ColumnInfo(name = "user_name")
private String userName;
@ColumnInfo(name = "password")
private String password;
@ColumnInfo(name = "current_money")
private double currentMoney; public User(String userName, String password) {
this.userName = userName;
this.password = password;
this.currentMoney = 0;
} public int getId() {
return id;
} public void setId(int id) {
this.id = id;
} public String getUserName() {
return userName;
} public void setUserName(String userName) {
this.userName = userName;
} public String getPassword() {
return password;
} public void setPassword(String password) {
this.password = password;
} public double getCurrentMoney() {
return currentMoney;
} public void setCurrentMoney(double currentMoney) {
this.currentMoney = currentMoney;
}
}
2、Dao
package com.me.familybookkeepingbook; import androidx.room.Dao;
import androidx.room.Delete;
import androidx.room.Insert;
import androidx.room.Query;
import androidx.room.Update; @Dao
public interface UserDao {
@Insert
void insertUser(User...users);
@Delete
void deleteUser(User...users);
@Update
void updateUser(User...users);
@Query("SELECT * From USER WHERE user_name like:userName_y AND password like :password_y")
User findUser(String userName_y ,String password_y);
}
3、DataBase
package com.me.familybookkeepingbook; import androidx.room.Database;
import android.content.Context;
import androidx.room.Room;
import androidx.room.RoomDatabase; @Database(entities = {User.class},version = 1,exportSchema = false)
public abstract class UserDatabase extends RoomDatabase {
private static UserDatabase INSTANCE;
public abstract UserDao getUserDao();
static synchronized UserDatabase getUserDataBase(Context context){
if (INSTANCE == null){
INSTANCE = Room.databaseBuilder(context.getApplicationContext(),UserDatabase.class,"user_database")
.build();
}
return INSTANCE;
}
}
4、工厂
package com.me.familybookkeepingbook; import android.content.Context;
import android.os.AsyncTask; import androidx.lifecycle.LiveData; import java.util.List; public class UserRepository {
private UserDao userDao;
static User user_0;
public UserRepository(Context context) {
UserDatabase userDatabase = UserDatabase.getUserDataBase(context.getApplicationContext());
userDao = userDatabase.getUserDao();
} void insertUser(User ... users){
new InsertAsyncTask(userDao).execute(users);
}
void deleteUser(User ... users){
new DeleteAsyncTask(userDao).execute(users);
}
void updateUser(User ... users){
new UpdateAsyncTask(userDao).execute(users);
}
Boolean queueUser(User user){
new QueueAsyncTask(userDao).execute(user);
if(user==null||user_0==null){
return false;
}else if(user_0.getUserName().equals(user.getUserName())&&user_0.getPassword().equals(user.getPassword())){
return true;
}else {
return false;
}
}
static class InsertAsyncTask extends AsyncTask<User ,Void,Void> {
private UserDao userDao; public InsertAsyncTask(UserDao userDao) {
this.userDao = userDao;
} @Override
protected Void doInBackground(User... users) {
userDao.insertUser(users);
return null;
}
}
static class DeleteAsyncTask extends AsyncTask<User ,Void,Void> {
private UserDao userDao; public DeleteAsyncTask(UserDao userDao) {
this.userDao = userDao;
} @Override
protected Void doInBackground(User... users) {
userDao.deleteUser(users);
return null;
}
}
static class UpdateAsyncTask extends AsyncTask<User ,Void,Void> {
private UserDao userDao; public UpdateAsyncTask(UserDao userDao) {
this.userDao = userDao;
} @Override
protected Void doInBackground(User... users) {
userDao.updateUser(users);
return null;
}
}
static class QueueAsyncTask extends AsyncTask<User ,Void,Void> {
private UserDao userDao;
public QueueAsyncTask(UserDao userDao) {
this.userDao = userDao;
} @Override
protected Void doInBackground(User... users) {
User user1 = new User("王正帅","123");
for (User user:users) {
user1 = userDao.findUser(user.getUserName(),user.getPassword());
user_0 = user1;
}
return null;
}
} }
三、功能逻辑
1、注册
1)点击注册从登入转到注册界面
buttonRegister.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
NavController controller = Navigation.findNavController(v);
controller.navigate(R.id.action_loginFragment_to_userAddFragment);
}
});
2)将正确数据添加导数据库并返回登录界面
@Override
public void onActivityCreated(@Nullable Bundle savedInstanceState) {
super.onActivityCreated(savedInstanceState);
userRepository = new UserRepository(requireActivity());
buttonRegister = requireActivity().findViewById(R.id.buttonR);
editTextPassword = requireActivity().findViewById(R.id.editTextP);
editTextRP = requireActivity().findViewById(R.id.editTextRP);
editTextUserName = requireActivity().findViewById(R.id.editTextU);
buttonRegister.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
String userName = editTextUserName.getText().toString().trim();
String password = editTextPassword.getText().toString().trim();
User user = new User(userName,password);
userRepository.insertUser(user);
NavController controller = Navigation.findNavController(v);
controller.navigate(R.id.action_userAddFragment_to_loginFragment);
}
});
}
2、登入
buttonLogin.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
String userName = editTextUserName.getText().toString().trim();
String password = editTextPassword.getText().toString().trim();
User user = new User(userName,password);
Boolean f = userRepository.queueUser(user);
if(f){
NavController controller = Navigation.findNavController(v);
controller.navigate(R.id.action_loginFragment_to_accountRecordFragment);
}else {
AlertDialog.Builder builder = new AlertDialog.Builder(requireActivity());
builder.setTitle("账号或密码错误,请重新输入!");
builder.setPositiveButton("确定", new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
}
});
builder.create();
builder.show();
}
}
});
四、运行测试


【Android】家庭记账本手机版开发报告五的更多相关文章
- 【Android】家庭记账本手机版开发报告二
一.说在前面 昨天 完成了对记账本的账单的增删 今天 完善昨天的框架结构( 1.引入ViewModel管理数据.使MainActive 只管理界面.不再管数据了 2.引入AsyncTask.后台执行. ...
- 【Android】家庭记账本手机版开发报告一
一.说在前面 昨天 学习了数据库的一些简单操作 今天 使用数据库,完成对记账本的账单记录的增删 问题 没有 二.数据库 1.账单表的结构 (注 id:账单的唯一标识,uid:记录账单的用户的id,co ...
- 【Android】家庭记账本手机版开发报告七
一.说在前面 昨天 实现了账单的图标显示 今天 本地化,测试APP,将工程源码放到github上 源码:https://github.com/xiaotian12-call/Android_Boo ...
- 【Android】家庭记账本手机版开发报告六
一.说在前面 昨天 1.创建登入和注册界面:2.向数据库添加一张用户表 今天 用图标显示账单情况 问题 1.使用第三方库 hellochart,时添加依赖构建失败 2.在 chertFragmen ...
- 【Android】家庭记账本手机版开发报告四
一.说在前面 昨天 对界面显示和逻辑结构进行完善 今天 1.添加菜单(查询.清除所有等) 2.使用滑动删除 问题 1.在做查询时获取SearchView时引 入包错误经过长时间的尝试后才修正 2.滑动 ...
- 【Android】家庭记账本手机版开发报告三
一.说在前面 昨天 对第一天的框架结构进行了四方面的完善 今天 对界面显示和逻辑结构进行完善 问题 无 二.界面展示完善 1.使用可回收的列表recyclerView展示账单的信息,并设置数据项为卡片 ...
- Android深度探索--HAL与驱动开发----第五章读书笔记
第五章主要学习了搭建S3C6410开发板的测试环境.首先要了解到S3C6410是一款低功耗.高性价比的RISC处理器它是基于ARMI1内核,广泛应用于移动电话和通用处理等领域. 开发板从技术上说与我们 ...
- WPS Office手机版调用接口代码指导帖之一(Android)
经常会有一些喜欢开发鼓捣的童鞋问我们,WPS Office手机版是否提供调用接口,希望在android中使用一个调用命令,直接调用WPS手机版来打开指定的DOC文件,而不用弹出一个程序可选列表(如果用 ...
- 手机版WEB开发经验分享,手机版网站开发注意事项,网站自适应,手机版网站自适应,移动安卓APP自适应
转自 http://my.oschina.net/cart/blog/282477 做前端开发不短了,用过jQuery Mobile jqMobi 也纯手工写过.. 最后总结如下: jQuery Mo ...
随机推荐
- ROS学习笔记INF-重要操作列表
该笔记将重要操作的步骤进行列表,以便查询: 添加消息 在包中的msg文件夹中创建msg文件 确保package.xml中的如下代码段被启用: <build_depend>message_g ...
- sql语句中,传入的参数带单引号的问题
今天在大批量操作数据时,遇到此问题,解决如下: if(cateName.indexOf("'")!=-1){ oql = " select * where name = ...
- Lesson 6 The sporting spirit
How does the writer describe sport at the international level? I am always amazed when I hear people ...
- 装系统:Win7,机子是Dell 5460,有半高的mSATA SSD
问题描述:Dell Vostro 5460有一个机械盘,有一个半高的mSATA SSD,现在想将系统重装到mSATA SSD上,但是机子BIOS的Boot选项没有mSATA,只有机械盘,怎么办? 解决 ...
- Windows驱动开发-r3和r0通信
用户部分代码: int main() { HANDLE hDevice = CreateFile(L, NULL, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL ...
- Prometheus Operator【转】
前面我们介绍了 Kubernetes 的两种监控方案 Weave Scope 和 Heapster,它们主要的监控对象是 Node 和 Pod.这些数据对 Kubernetes 运维人员是必须的,但还 ...
- ERROR 2002 (HY000): Can't connect to local MySQL server through socket '/var/run/mysqld/mysqld.sock'解决
用XAMPP装装好mysql之后,mysql -uroot 连不上,报这个错误: ERROR 2002 (HY000): Can't connect to local MySQL server t ...
- Eclipse打包Android项目时用到proguard.cfg后,出现的Warning:can't find referenced class问题的解决方案
原文地址:http://blog.csdn.net/u_xtian/article/details/7495023 这个看似简单的问题困扰了我好久了,我已经google了很多相关的信息了,但是在我看来 ...
- java基础知识(1)
Java包 包主要用来对类和接口进行分类.当开发Java程序时,可能编写成百上千的类,因此很有必要对类和接口进行分类. Import语句 在Java中,如果给出一个完整的限定名,包括包名.类名,那么J ...
- 003-explode分割字符串
<?php $str = "品牌电脑@品牌手机@高档男士衬衫@高档女士挎包"; //定义字符串常量 $str_arr = explode("@", $st ...