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

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

绘制对话跨页面

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

<?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>

效果图:image-20220126193620745

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

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

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

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

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类似

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

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

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

/*
* 向记账表当中插入一条元素
* */
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判断条件我写成

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

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

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

posted @ 2022-01-24 20:16  open520  阅读(113)  评论(0)    收藏  举报