一、说在前面

昨天 对第一天的框架结构进行了四方面的完善
今天 对界面显示和逻辑结构进行完善
问题

二、界面展示完善

1、使用可回收的列表recyclerView展示账单的信息,并设置数据项为卡片

<?xml version="1.0" encoding="utf-8"?>
<FrameLayout 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=".AccountRecordFragment"
android:id="@+id/frameLayout"> <com.google.android.material.floatingactionbutton.FloatingActionButton
android:id="@+id/floatingActionButton"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="bottom|center_horizontal"
android:layout_margin="16dp"
android:clickable="true"
android:focusable="true"
android:src="@drawable/ic_add_witer_24dp"
tools:layout_conversion_absoluteHeight="56dp"
tools:layout_conversion_absoluteWidth="56dp"
tools:layout_editor_absoluteX="178dp"
tools:layout_editor_absoluteY="659dp" /> <androidx.recyclerview.widget.RecyclerView
android:id="@+id/recyclerView"
android:layout_width="match_parent"
android:layout_height="wrap_content"
tools:layout_conversion_absoluteHeight="731dp"
tools:layout_conversion_absoluteWidth="411dp"
tools:layout_editor_absoluteX="0dp"
tools:layout_editor_absoluteY="0dp" />
</FrameLayout>

<?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="wrap_content"
android:orientation="vertical"> <androidx.cardview.widget.CardView
android:layout_width="match_parent"
android:layout_height="match_parent"
android:foreground="?selectableItemBackground"
android:layout_marginLeft="8dp"
android:layout_marginTop="8dp"
android:layout_marginRight="8dp"
android:layout_marginBottom="4dp"> <androidx.constraintlayout.widget.ConstraintLayout
android:layout_width="match_parent"
android:layout_height="match_parent"> <androidx.constraintlayout.widget.Guideline
android:id="@+id/guideline"
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/guideline5"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:orientation="vertical"
app:layout_constraintGuide_percent="0.95" /> <TextView
android:id="@+id/textViewid"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="@string/textviewid"
android:textSize="24sp"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintEnd_toStartOf="@+id/guideline"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toTopOf="parent"
tools:text="1" /> <TextView
android:id="@+id/textViewtype"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginTop="8dp"
android:layout_marginBottom="8dp"
android:text="@string/textviewtype"
android:textSize="24sp"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintEnd_toStartOf="@+id/textViewtime"
app:layout_constraintHorizontal_bias="0.5"
app:layout_constraintStart_toStartOf="@+id/guideline"
app:layout_constraintTop_toTopOf="parent" /> <TextView
android:id="@+id/textViewtime"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="@string/textviewtime"
android:textSize="24sp"
app:layout_constraintBottom_toBottomOf="@+id/textViewtype"
app:layout_constraintEnd_toStartOf="@+id/textViewmoney"
app:layout_constraintHorizontal_bias="0.5"
app:layout_constraintStart_toEndOf="@+id/textViewtype"
app:layout_constraintTop_toTopOf="@+id/textViewtype" /> <TextView
android:id="@+id/textViewmoney"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="@string/textviewmoney"
android:textSize="24sp"
app:layout_constraintBottom_toBottomOf="@+id/textViewtime"
app:layout_constraintEnd_toStartOf="@+id/guideline5"
app:layout_constraintHorizontal_bias="0.5"
app:layout_constraintStart_toEndOf="@+id/textViewtime"
app:layout_constraintTop_toTopOf="@+id/textViewtime" />
</androidx.constraintlayout.widget.ConstraintLayout>
</androidx.cardview.widget.CardView>
</LinearLayout>

卡片展示数据,点击有阴影效果

2、构建展示数据界面和添加数据页面和Navigation

1)构建展示数据界面

<?xml version="1.0" encoding="utf-8"?>
<FrameLayout 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=".AccountRecordFragment"
android:id="@+id/frameLayout"> <com.google.android.material.floatingactionbutton.FloatingActionButton
android:id="@+id/floatingActionButton"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="bottom|center_horizontal"
android:layout_margin="16dp"
android:clickable="true"
android:focusable="true"
android:src="@drawable/ic_add_witer_24dp"
tools:layout_conversion_absoluteHeight="56dp"
tools:layout_conversion_absoluteWidth="56dp"
tools:layout_editor_absoluteX="178dp"
tools:layout_editor_absoluteY="659dp" /> <androidx.recyclerview.widget.RecyclerView
android:id="@+id/recyclerView"
android:layout_width="match_parent"
android:layout_height="wrap_content"
tools:layout_conversion_absoluteHeight="731dp"
tools:layout_conversion_absoluteWidth="411dp"
tools:layout_editor_absoluteX="0dp"
tools:layout_editor_absoluteY="0dp" />
</FrameLayout>

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/addLayout"
android:layout_width="match_parent"
android:layout_height="match_parent"
tools:context=".addFragment" > <TextView
android:id="@+id/textView"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="@string/account_record_title"
android:textSize="24sp"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toTopOf="parent"
app:layout_constraintVertical_bias="0.1" /> <EditText
android:id="@+id/editTexttype"
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:autofillHints=""
android:ems="10"
android:hint="@string/cost_type"
android:inputType="textPersonName"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintHorizontal_bias="0.0"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toTopOf="parent"
app:layout_constraintVertical_bias="0.2" /> <EditText
android:id="@+id/editTextmoney"
android:layout_width="0dp"
android:layout_height="wrap_content"
android:autofillHints=""
android:ems="10"
android:hint="@string/cost_money"
android:inputType="textPersonName"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintEnd_toEndOf="@+id/editTexttype"
app:layout_constraintHorizontal_bias="0.0"
app:layout_constraintStart_toStartOf="@+id/editTexttype"
app:layout_constraintTop_toTopOf="parent"
app:layout_constraintVertical_bias="0.35" /> <Button
android:id="@+id/buttonsubmit"
android:layout_width="0dp"
android:layout_height="wrap_content"
android:text="@string/button_submit"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintEnd_toEndOf="@+id/editTextmoney"
app:layout_constraintHorizontal_bias="0.0"
app:layout_constraintStart_toStartOf="@+id/editTextmoney"
app:layout_constraintTop_toTopOf="parent"
app:layout_constraintVertical_bias="0.5" /> </androidx.constraintlayout.widget.ConstraintLayout>

3)、创建Navigation

<?xml version="1.0" encoding="utf-8"?>
<navigation 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/nav"
app:startDestination="@id/accountRecordFragment"> <fragment
android:id="@+id/accountRecordFragment"
android:name="com.me.familybookkeepingbook.AccountRecordFragment"
android:label="account_record"
tools:layout="@layout/fragment_account_record">
<action
android:id="@+id/action_accountRecordFragment_to_addFragment"
app:destination="@id/addFragment" />
</fragment>
<fragment
android:id="@+id/addFragment"
android:name="com.me.familybookkeepingbook.addFragment"
android:label="add"
tools:layout="@layout/fragment_add" />
</navigation>

三、代码逻辑相应完善

1、适配器

package com.me.familybookkeepingbook;

import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.TextView; import androidx.annotation.NonNull;
import androidx.recyclerview.widget.RecyclerView; import java.util.ArrayList;
import java.util.List; public class MyAdpter extends RecyclerView.Adapter <MyAdpter.MyViewHolder>{
List<AccountRecord> allAccountRecords = new ArrayList<>();
public void setAllAccountRecords(List<AccountRecord> allAccountRecords) {
this.allAccountRecords = allAccountRecords;
} @NonNull
@Override
public MyViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
LayoutInflater layoutInflater = LayoutInflater.from(parent.getContext());
View itemView = layoutInflater.inflate(R.layout.cost_itme_c_1,parent,false);
MyViewHolder holder = new MyViewHolder(itemView);
holder.itemView.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) { }
});
return holder;
} @Override
public void onBindViewHolder(@NonNull MyViewHolder holder, int position) {
AccountRecord accountRecord = allAccountRecords.get(position);
holder.textViewId.setText(String.valueOf(position+1));
holder.textViewMoney.setText(String.valueOf(accountRecord.getCostMoney()));
holder.textViewTime.setText(accountRecord.getCostTime());
holder.textViewType.setText(accountRecord.getCostType());
} @Override
public int getItemCount() {
return allAccountRecords.size() ;
} static class MyViewHolder extends RecyclerView.ViewHolder{
TextView textViewId,textViewType,textViewMoney,textViewTime;
public MyViewHolder(@NonNull View itemView) {
super(itemView);
textViewId = itemView.findViewById(R.id.textViewid);
textViewType = itemView.findViewById(R.id.textViewtype);
textViewTime = itemView.findViewById(R.id.textViewtime);
textViewMoney = itemView.findViewById(R.id.textViewmoney);
}
} }

2、数据展示

 @Override
public void onActivityCreated(@Nullable Bundle savedInstanceState) {
super.onActivityCreated(savedInstanceState);
accountRecordViewModel = ViewModelProviders.of(requireActivity()).get(AccountRecordViewModel.class);
recyclerView = requireActivity().findViewById(R.id.recyclerView);
recyclerView.setLayoutManager(new LinearLayoutManager(requireActivity()));
myAdpter = new MyAdpter();
recyclerView.setAdapter(myAdpter);
accountRecordViewModel.getAllAcountRecord().observe(requireActivity(), new Observer<List<AccountRecord>>() {
@Override
public void onChanged(List<AccountRecord> accountRecords) {
myAdpter.setAllAccountRecords(accountRecords);
myAdpter.notifyDataSetChanged();
}
});
floatingActionButton = requireActivity().findViewById(R.id.floatingActionButton);
floatingActionButton.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
NavController navController = Navigation.findNavController(v);
navController.navigate(R.id.action_accountRecordFragment_to_addFragment);
}
});
}

3、进入添加界面自动聚焦到第一个输入框并弹出键盘添加完成后返回数据展示界面并去除键盘

1)、聚焦到第一个输入框并弹出键盘

editTextType.requestFocus();
InputMethodManager imm = (InputMethodManager) activity.getSystemService(Context.INPUT_METHOD_SERVICE);
imm.showSoftInput(editTextType,0);

2)、返回数据展示界面去除键盘

InputMethodManager imm = (InputMethodManager) requireActivity().getSystemService(Context.INPUT_METHOD_SERVICE);
imm.hideSoftInputFromWindow(v.getWindowToken(),0);

4、获取添加界面数据并添加到数据库

package com.me.familybookkeepingbook;

import android.content.Context;
import android.os.Bundle; import androidx.annotation.Nullable;
import androidx.fragment.app.Fragment;
import androidx.fragment.app.FragmentActivity;
import androidx.lifecycle.ViewModelProviders;
import androidx.navigation.NavController;
import androidx.navigation.Navigation; import android.text.Editable;
import android.text.TextWatcher;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.view.Window;
import android.view.inputmethod.InputMethodManager;
import android.widget.Button;
import android.widget.EditText; import java.text.SimpleDateFormat;
import java.util.Date; /**
* A simple {@link Fragment} subclass.
*/
public class addFragment extends Fragment {
private Button buttonSubmit;
private EditText editTextType,editTextMoney;
private AccountRecordViewModel accountRecordViewModel;
public addFragment() {
// Required empty public constructor
} @Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) {
// Inflate the layout for this fragment
return inflater.inflate(R.layout.fragment_add, container, false);
} @Override
public void onActivityCreated(@Nullable Bundle savedInstanceState) {
super.onActivityCreated(savedInstanceState);
FragmentActivity activity = requireActivity();
accountRecordViewModel = ViewModelProviders.of(activity).get(AccountRecordViewModel.class);
buttonSubmit = activity.findViewById(R.id.buttonsubmit);
editTextMoney = activity.findViewById(R.id.editTextmoney);
editTextType = activity.findViewById(R.id.editTexttype);
buttonSubmit.setEnabled(false);
editTextType.requestFocus();
InputMethodManager imm = (InputMethodManager) activity.getSystemService(Context.INPUT_METHOD_SERVICE);
imm.showSoftInput(editTextType,0);
TextWatcher textWatcher = new TextWatcher() {
@Override
public void beforeTextChanged(CharSequence s, int start, int count, int after) {
String type = editTextType.getText().toString().trim();
String money = editTextMoney.getText().toString().trim();
buttonSubmit.setEnabled(!type.isEmpty()&&!money.isEmpty()); } @Override
public void onTextChanged(CharSequence s, int start, int before, int count) { } @Override
public void afterTextChanged(Editable s) { }
};
editTextType.addTextChangedListener(textWatcher);
editTextMoney.addTextChangedListener(textWatcher);
buttonSubmit.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
String type = editTextType.getText().toString().trim();
String money = editTextMoney.getText().toString().trim();
SimpleDateFormat simpleDateFormat = new SimpleDateFormat("yy-MM-dd HH:mm");// HH:mm:ss
//获取当前时间
Date date = new Date(System.currentTimeMillis());
Double money_d = Double.valueOf(money);
AccountRecord accountRecord = new AccountRecord(1, simpleDateFormat.format(date),type,money_d);
accountRecordViewModel.insertAccountRecord(accountRecord);
NavController navController = Navigation.findNavController(v);
navController.navigateUp();
InputMethodManager imm = (InputMethodManager) requireActivity().getSystemService(Context.INPUT_METHOD_SERVICE);
imm.hideSoftInputFromWindow(v.getWindowToken(),0); }
});
}
}

【Android】家庭记账本手机版开发报告三的更多相关文章

  1. 【Android】家庭记账本手机版开发报告五

    一.说在前面   昨天  1.添加菜单(查询.清除所有等)2.使用滑动删除   今天 1.创建登入和注册界面 2.向数据库添加一张用户表   问题 做完后在登入时有bug(未解决) 二.界面的搭建 1 ...

  2. 【Android】家庭记账本手机版开发报告二

    一.说在前面 昨天 完成了对记账本的账单的增删 今天 完善昨天的框架结构( 1.引入ViewModel管理数据.使MainActive 只管理界面.不再管数据了 2.引入AsyncTask.后台执行. ...

  3. 【Android】家庭记账本手机版开发报告一

    一.说在前面 昨天 学习了数据库的一些简单操作 今天 使用数据库,完成对记账本的账单记录的增删 问题 没有 二.数据库 1.账单表的结构 (注 id:账单的唯一标识,uid:记录账单的用户的id,co ...

  4. 【Android】家庭记账本手机版开发报告七

    一.说在前面  昨天 实现了账单的图标显示  今天 本地化,测试APP,将工程源码放到github上 源码:https://github.com/xiaotian12-call/Android_Boo ...

  5. 【Android】家庭记账本手机版开发报告六

    一.说在前面  昨天 1.创建登入和注册界面:2.向数据库添加一张用户表  今天 用图标显示账单情况 问题 1.使用第三方库 hellochart,时添加依赖构建失败 2.在 chertFragmen ...

  6. 【Android】家庭记账本手机版开发报告四

    一.说在前面 昨天 对界面显示和逻辑结构进行完善 今天 1.添加菜单(查询.清除所有等) 2.使用滑动删除 问题 1.在做查询时获取SearchView时引 入包错误经过长时间的尝试后才修正 2.滑动 ...

  7. ReadHub项目Kotlin版开发指南(三、MVP架构)

    ReadHub项目Kotlin版转换指南(一.环境搭建) ReadHub项目Kotlin版转换指南(二.数据库和网络请求) ReadHub项目Kotlin版转换指南(三.MVP架构) Android ...

  8. Android深度探索HAL与驱动开发 第三章 Git入门

    Git功能十分复杂,简单来说它使你的开发更为快捷和可控,尤其是在开源项目上展现的友好的交互和回馈. 熟悉一些git指令操作对开发者的帮助可以避免开发者受到一些外在因素打断开发进度,甚至延误项目的che ...

  9. Android深度探索--HAL与驱动开发----第三章读书笔记

    1. 什么是Git? Git是一个开源的分布式版本控制系统,用以有效.高速的处理从很小到非常大的项目版本管理.Git 是 Linus Torvalds 为了帮助管理 Linux 内核开发而开发的一个开 ...

随机推荐

  1. H5地理定位获取用户当前位置、城市

    第一步:需要在百度地图开发者平台创建一个应用:http://lbsyun.baidu.com/apiconsole/key/create 配置信息 申请配置成功以后返回一个AK 第二步:引入百度地图的 ...

  2. H5禁止底部横向滚动条,使一个元素居中

    1.禁止底部横向滚动条 选择元素设置样式 { overflow-y:auto; overflow-x:hidden } 2.元素居中 { margin-left:auto ; margin-right ...

  3. vue 组件 - 函数统一调用(自定义钩子)

    vue 组件继承方法 var childComponent = Vue.extend( { extends: baseComp, // 继承基础组件方法 template:template, wait ...

  4. vs2015中安装cplex攻略以及解决丢失cplex.dll问题

    转:http://blog.sina.com.cn/s/blog_61f0374801014swp.html 按:相信配置过CPLEX的人大多有过痛苦而难忘的经历,本人亦不例外,纠结挣扎了一个下午加一 ...

  5. MySQL日常使用笔记

    逍遥山人的MySQL使用笔记,持续更新中 表结构 新建表以及添加表和字段的注释 create table t_user( ID INT(11) primary key auto_increment c ...

  6. JAVA实现单例模式的四种方法和一些特点

    JAVA实现单例模式的四种方法和一些特点,需要的朋友可以参考一下     一.饿汉式单例类 复制代码 代码如下: public class Singleton  {      private Sing ...

  7. git+jenkins jar包代码的发布加新建项目

    1.本地仓库  java开发 把代码上传上来 ,问一下他要上传到的主机ip , 分支 2.本地 , 设置-->仓库 更新数据,让他同步到南阳gitlab, 若没有这个项目,需要创建相同名字的项目 ...

  8. 吴裕雄 Bootstrap 前端框架开发——Bootstrap 辅助类:清除浮动1

    <!DOCTYPE html> <html> <head> <meta charset="utf-8"> <title> ...

  9. AC自动机 (模板)

    AC自动机是用来干什么的: AC自动机是用来解决多模匹配问题,例如有单词s1,s2,s3,s4,s5,s6,问:在文本串ss中有几个单词出现过,类似. AC自动机实现这个功能需要三个部分: 1.将所有 ...

  10. volume 方式使用 Secret【转】

    Pod 可以通过 Volume 或者环境变量的方式使用 Secret,今天先学习 Volume 方式. Pod 的配置文件如下所示: ① 定义 volume foo,来源为 secret mysecr ...