android软件简约记账app开发day08-时间对话框的书写+改bug,改bug

绘制对话跨页面

在添加记账信息功能中,我提供了用户添加备注添加事件的功能,设计是点击时间会弹出一个时间对话框供用户选择时间,这里我们先绘制时间对话框,在layout中新建一个layout文件,命名为dialog_time,其中使用到了提供好了类DataPicker来展示日历效果,代码如下

  1. <?xml version="1.0" encoding="utf-8"?>
    <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
       android:orientation="vertical" android:layout_width="wrap_content"
       android:layout_height="wrap_content"
       android:background="@color/white">
       <DatePicker
           android:id="@+id/dialog_time_dp"
           android:layout_width="wrap_content"
           android:layout_height="wrap_content"/>

       <TextView
           android:layout_width="wrap_content"
           android:layout_height="wrap_content"
           android:text="@string/please_input_time"
           android:padding="10dp"/>
       <LinearLayout
           android:layout_width="wrap_content"
           android:layout_height="wrap_content"
           android:orientation="horizontal"
           android:padding="10dp">
           <EditText
               android:id="@+id/dialog_time_et_hour"
               android:layout_width="60dp"
               android:layout_height="wrap_content"
               android:inputType="number"
               android:maxLength="2"/>
           <TextView
               android:layout_width="wrap_content"
               android:layout_height="wrap_content"
               android:text=" : "
               android:textSize="20dp"
               android:textStyle="bold"/>
           <EditText
               android:id="@+id/dialog_time_et_minute"
               android:layout_width="60dp"
               android:layout_height="wrap_content"
               android:inputType="number"
               android:maxLength="2"/>
       </LinearLayout>
       <LinearLayout
           android:layout_width="wrap_content"
           android:layout_height="wrap_content"
           android:layout_gravity="right"
           android:orientation="horizontal">
           <Button
               android:id="@+id/dialog_time_btn_cancel"
               android:layout_width="80dp"
               android:layout_height="wrap_content"
               android:text="@string/cancel"
               android:textColor="@color/white"
               android:background="@null"
               android:layout_marginRight="20dp"/>
           <Button
               android:id="@+id/dialog_time_btn_ensure"
               android:layout_width="80dp"
               android:layout_height="wrap_content"
               android:text="@string/ensure"
               android:textColor="@color/white"
               android:background="@null"
               android:layout_marginRight="20dp"/>
       </LinearLayout>
    </LinearLayout>

效果图:

在页面绘制完成后,我们来书写java类来关联和管理该事件对话框

在util包下新建SelectTimeDialog类来关联该对话框,和之前一样,首先添加该页面上的所有控件

  1. EditText hourEt,minuteEt;
    DatePicker datePicker;
    Button ensureBtn,cancelBtn;

在OnCerate方法中获取变量对象,并且添加OnClick方法为取消和确定添加单机事件,在点击了确定按钮后,我们要获取用户输入的时间,并做判断处理。其次在该方法中我也添加了隐藏时间对话框的头部的方法,因为该方法可能比较泛泛,所以我从网上找了一个,并且可以正常使用。

  1. package com.open.tally.util;

    import android.app.Dialog;
    import android.content.Context;
    import android.os.Bundle;
    import android.text.TextUtils;
    import android.view.View;
    import android.view.ViewGroup;
    import android.widget.Button;
    import android.widget.DatePicker;
    import android.widget.EditText;

    import androidx.annotation.NonNull;

    import com.open.tally.R;

    /*
    * 在记录页面弹出时间对话框
    * */
    public class SelectTimeDialog extends Dialog implements View.OnClickListener {
       EditText hourEt,minuteEt;
       DatePicker datePicker;
       Button ensureBtn,cancelBtn;
       public interface OnEnsureListener{
           public void onEnsure(String time,int year,int month,int day);
      }
       OnEnsureListener onEnsureListener;

       public void setOnEnsureListener(OnEnsureListener onEnsureListener) {
           this.onEnsureListener = onEnsureListener;
      }

       public SelectTimeDialog(@NonNull Context context) {
           super(context);
      }

       @Override
       protected void onCreate(Bundle savedInstanceState) {
           super.onCreate(savedInstanceState);
           setContentView(R.layout.dialog_time);
           hourEt = findViewById(R.id.dialog_time_et_hour);
           minuteEt = findViewById(R.id.dialog_time_et_minute);
           datePicker = findViewById(R.id.dialog_time_dp);
           ensureBtn = findViewById(R.id.dialog_time_btn_ensure);
           cancelBtn = findViewById(R.id.dialog_time_btn_cancel);
           ensureBtn.setOnClickListener(this);  //添加点击监听事件
           cancelBtn.setOnClickListener(this);
           hideDatePickerHeader();
      }

       @Override
       public void onClick(View v) {
           switch (v.getId()) {
               case R.id.dialog_time_btn_cancel:
                   cancel();
                   break;
               case R.id.dialog_time_btn_ensure:
                   int year = datePicker.getYear();  //选择年份
                   int month = datePicker.getMonth()+1;
                   int dayOfMonth = datePicker.getDayOfMonth();
                   String monthStr = String.valueOf(month);
                   if (month<10){
                       monthStr = "0"+month;
                  }
                   String dayStr = String.valueOf(dayOfMonth);
                   if (dayOfMonth<10){
                       dayStr="0"+dayOfMonth;
                  }
    //             获取输入的小时和分钟
                   String hourStr = hourEt.getText().toString();
                   String minuteStr = minuteEt.getText().toString();
                   int hour = 0;
                   if (!TextUtils.isEmpty(hourStr)) {
                       hour = Integer.parseInt(hourStr);
                       hour=hour%24;
                  }
                   int minute = 0;
                   if (!TextUtils.isEmpty(minuteStr)) {
                       minute = Integer.parseInt(minuteStr);
                       minute=minute%60;
                  }

                   hourStr=String.valueOf(hour);
                   minuteStr=String.valueOf(minute);
                   if (hour<10){
                       hourStr="0"+hour;
                  }
                   if (minute<10){
                       minuteStr="0"+minute;
                  }
                   String timeFormat = year+"年"+monthStr+"月"+dayStr+"日 "+hourStr+":"+minuteStr;
                   if (onEnsureListener!=null) {
                       onEnsureListener.onEnsure(timeFormat,year,month,dayOfMonth);
                  }
                   cancel();
                   break;
          }
      }

       //隐藏DatePicker头布局
       private void hideDatePickerHeader(){
           ViewGroup rootView = (ViewGroup) datePicker.getChildAt(0);
           if (rootView == null) {
               return;
          }
           View headerView = rootView.getChildAt(0);
           if (headerView == null) {
               return;
          }
           //5.0+
           int headerId = getContext().getResources().getIdentifier("day_picker_selector_layout", "id", "android");
           if (headerId == headerView.getId()) {
               headerView.setVisibility(View.GONE);
               ViewGroup.LayoutParams layoutParamsRoot = rootView.getLayoutParams();
               layoutParamsRoot.width = ViewGroup.LayoutParams.WRAP_CONTENT;
               rootView.setLayoutParams(layoutParamsRoot);

               ViewGroup animator = (ViewGroup) rootView.getChildAt(1);
               ViewGroup.LayoutParams layoutParamsAnimator = animator.getLayoutParams();
               layoutParamsAnimator.width = ViewGroup.LayoutParams.WRAP_CONTENT;
               animator.setLayoutParams(layoutParamsAnimator);

               View child = animator.getChildAt(0);
               ViewGroup.LayoutParams layoutParamsChild = child.getLayoutParams();
               layoutParamsChild.width = ViewGroup.LayoutParams.WRAP_CONTENT;
               child.setLayoutParams(layoutParamsChild);
               return;
          }

           // 6.0+
           headerId = getContext().getResources().getIdentifier("date_picker_header","id","android");
           if (headerId == headerView.getId()) {
               headerView.setVisibility(View.GONE);
          }
      }
    }

接下来组装时间对话框

在BaseRecordFragment类中添加showTimeDialog方法和之前的showBZDialog类似

  1. private void showTimeDialog() {
       SelectTimeDialog dialog = new SelectTimeDialog(getContext());
       dialog.show();
       //设定确定按钮被点击了的监听器
       dialog.setOnEnsureListener(new SelectTimeDialog.OnEnsureListener() {
           @Override
           public void onEnsure(String time, int year, int month, int day) {
               timeTv.setText(time);
               accountBean.setTime(time);
               accountBean.setYear(year);
               accountBean.setMonth(month);
               accountBean.setDay(day);
          }
      });
    }

最后改bug,改bug

在完成如上操作后,我就立马进行了测试,可我惊奇的发现竟然添加不上记账信息,啊这。。。。。。。这可是我这项目的关键一步了啊,真乃行百里者半九十,我这快写完竟然添加不上,哎。。。。。。

首先我在添加数据的方法中写了一个日志

  1. /*
    * 向记账表当中插入一条元素
    * */
    public static void insertItemToAccounttb(AccountBean bean){
       ContentValues values = new ContentValues();
       values.put("typename",bean.getTypename());
       values.put("sImageId",bean.getsImageId());
       values.put("beizhu",bean.getBeizhu());
       values.put("money",bean.getMoney());
       values.put("time",bean.getTime());
       values.put("year",bean.getYear());
       values.put("month",bean.getMonth());
       values.put("day",bean.getDay());
       values.put("kind",bean.getKind());
       db.insert("accounttb",null,values);
       Log.i("open1314", "insertItemToAccounttb: okkk");
    }

我进行测试,竟然不输出日志信息,哎,也是,要输出了还添加不上那才见鬼了呢

之后我又分别再baserecordfragment类上的create、init方法上打上日志,他输出,然后我又再子类上打日志,他也输出,这就纳闷了啊,这哪里哪里都又日志,可就为什么添加不上呢,我又试了试好多办法,什么换虚拟机呀,重启项目啊,卸载重装啊等等方法,还是不行,我又默默的打开了baserecordfragment类,又分析了一边,再init方法中,我设置了一个监听器来获取用户输入的账目金额,当初写的时候,加了一个判断用户没有输入或输入为空的情况,这种情况就直接返回,不在设置金额,这逻辑也没错啊,我在if里打了一个日志,他竟然输出了,竟然输出了,这不应该呀,进入if中,就直接return掉了,不应该啊,这我一看,哎,if判断条件我写成

  1. if (!TextUtils.isEmpty(moneyStr) || moneyStr.equals("0")) {
       getActivity().finish();
       return;
    }

哎,不仔细看还真看不出来,应该没有!号,这都能写错,哎,简直了。

行了,今天又是改bug的一天。

android软件简约记账app开发day08-时间对话框的书写+改bug,改bug的更多相关文章

  1. android软件简约记账app开发day03-自定义键盘的书写

    android软件简约记账app开发day03-自定义键盘的书写 我们在fragment界面使用了自定义的keybroad键盘,所以今天我们来书写自定义的键盘代码 新建util包,新建keyboard ...

  2. android软件简约记账app开发day09-主页面模块,收支记账信息的展示

    android软件简约记账app开发day09-主页面模块,收支记账信息的展示 我们第一天已经绘制了记账条目的界面,也在主界面设置了LietView来展示记账条目,今天来实现记账后再主界面的展示效果 ...

  3. android软件简约记账app开发day05-记账页面条目代码优化和bug解决

    android软件简约记账app开发day05-记账页面条目代码优化和bug解决 今天还是因为该bug又极大的耽误了项目进程,该开发文档都要没有时间来写了. 先说bug吧,在昨天已经实现了页面图标的展 ...

  4. android软件简约记账app开发day04-记账页面条目的代码书写

    android软件简约记账app开发day04-记账页面条目的代码书写 在前三天我们完成了基本的界面展示,从今天开始,我们进入到后台逻辑代码的编写中,今天开发记账条目的代码 我们在主页面点击记一笔图标 ...

  5. android软件简约记账app开发day10-主页面模块--头信息的展示,和之后功能完善的目标。

    android软件简约记账app开发day10-主页面模块--头信息的展示,和之后功能完善的目标. 今天来写主界面头信息的展示,也就是将第一天的写的layout中的item_main_top展示到主界 ...

  6. android软件简约记账app开发day07-备注界面完善

    android软件简约记账app开发day07-备注界面完善 ## 昨天我们已经绘制了备注页面,今天来用Java代码组装完善一下. 首先我们新建BeiZhuDialog类关联备注页面,并且实现点击接口 ...

  7. android软件简约记账app开发day06-将记账条目添加到数据库并且绘制备注页面

    android软件简约记账app开发day06-将记账条目添加到数据库并且绘制备注页面 首先写添加到数据库 在DBOpenHelper中添加创建记账表的语句 //创建记账表 sql = "c ...

  8. android软件简约记账app开发day02-收入支出明细页面绘制

    android软件简约记账app开发day02-收入支出明细页面绘制 效果图 列表界面绘制 新建layout文件-item_mainlv.xml大体使用绝对布局,嵌套相对布局,嵌套文本内容实现 < ...

  9. android软件简约记账app开发day01-今日收支明细的界面绘制

    android软件简约记账app开发day01-今日收支明细的界面绘制 导入素材 导入在阿里iconfront图标库下载的字体图标分为大小两种,分别导入到项目目录mipmap-hdpi和mipmap- ...

随机推荐

  1. Python之VSCode

    在学习Python的过程中,一直没有找到比较趁手的第三方编辑器,用的最多的还是Python自带的编辑器.由于本人用惯了宇宙第一IDE(Visual Studio),所以当Visual Studio C ...

  2. Nginx配置不当(CRLF注入 、目录穿越)

    基于vulhub漏洞环境 环境搭建参考:https://blog.csdn.net/qq_36374896/article/details/84102101 1.漏洞名称 CRLF注入 2.漏洞原理 ...

  3. Git 工作流简介

    1.概述 工作流有各式各样的用法,但也正因此使得在实际工作中如何上手使用增加了难度.这篇指南通过总览公司团队中最常用的几种 Git 工作流让大家可以上手使用. 在阅读的过程中请记住,本文中的几种工作流 ...

  4. go语言学习入门篇1---go语言的主要特性与发展

    1.1 影响 Go 语言发展的早期编程语言 正如 "21 世纪的 C 语言" 这句话所说,Go 语言并不是凭空而造的,而是和 C++.Java 和 C# 一样属于 C 系.不仅如此 ...

  5. SQL获取当前时间(日期)

    --获取当前日期(如:yyyymmdd)select CONVERT (nvarchar(12),GETDATE(),112) --获取当前日期(如:yyyymmdd hh:MM:ss)select ...

  6. SpringDataRedis持续更新部分值使用方式

    官方文档:https://docs.spring.io/spring-data/redis/docs/2.3.4.RELEASE/reference/html/#redis.repositories. ...

  7. Java 线程具有五中基本状态 ?

    1.新建状态(New):当线程对象对创建后,即进入了新建状态,如:Thread t = new MyThread(): 2.就绪状态(Runnable):当调用线程对象的 start()方法(t.st ...

  8. spring 支持哪些 ORM 框架 ?

    Hibernate iBatis JPA JDO OJB

  9. Grep 命令有什么用? 如何忽略大小写? 如何查找不含 该串的行?

    是一种强大的文本搜索工具,它能使用正则表达式搜索文本,并把匹 配的行打印 出来. grep [stringSTRING] filename grep [^string] filename

  10. centos 7环境下安装jdk

    在此之前已经安装了xshell并能传输文件. 1.下载对应版本的jdk:jdk-8u191-linux-x64.tar.gz 2.上传到centos的目录下 3.解压jdk的gz包,命令: tar - ...