第64篇 Android Studio实现油耗记录App(九) MyDialog类

第64篇 Android Studio实现油耗记录App(九) MyDialog类

1.整体的代码

package com.example.listadapter;

import android.app.Activity;
import android.app.Dialog;
import android.content.Context;
import android.os.Bundle;
import android.view.Display;
import android.view.Gravity;
import android.view.View;
import android.view.Window;
import android.view.WindowManager;

import androidx.annotation.NonNull;

public class MyDialog extends Dialog implements View.OnClickListener{
    //在构造方法里提前加载了样式
    private Context context;//上下文
    //布局文件id
    private int[] listenedItem;//监听的控件id
    public MyDialog(Context context, int layoutResID, int[] listenedItem){
        super(context, layoutResID);//加载dialog的样式
        this.context = context;
        this.listenedItem = listenedItem;
    }

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

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        //提前设置Dialog的一些样式
        Window dialogWindow = getWindow();
        dialogWindow.setGravity(Gravity.CENTER_VERTICAL);//设置dialog显示居中
        //dialogWindow.setWindowAnimations();设置动画效果
        setContentView(R.layout.data_input_layout);

        WindowManager windowManager = ((Activity)context).getWindowManager();
        Display display = windowManager.getDefaultDisplay();
        WindowManager.LayoutParams lp = getWindow().getAttributes();
        lp.width = display.getWidth()*4/5;// 设置dialog宽度为屏幕的4/5
        lp.height = display.getHeight() * 2/5;
        getWindow().setAttributes(lp);
        setCanceledOnTouchOutside(true);//点击外部Dialog消失
        //遍历控件id添加点击注册
        for(int id:listenedItem){
            findViewById(id).setOnClickListener(this);
        }
    }
    private OnCenterItemClickListener listener;
    public interface OnCenterItemClickListener {
        void OnCenterItemClick(MyDialog dialog, View view);
    }
    //很明显我们要在这里面写个接口,然后添加一个方法
    public void setOnCenterItemClickListener(OnCenterItemClickListener listener) {
        this.listener = listener;
    }


    @Override
    public void onClick(View v) {
        dismiss();//注意:我在这里加了这句话,表示只要按任何一个控件的id,弹窗都会消失,不管是确定还是取消。
        listener.OnCenterItemClick(this,v);
    }
}

从上往下看,第一个是(上下文),这个上一篇刚刚说过
第二是监听的id,这里说明一下,监听的id是这个dialog上面的id,也就是保存和取消。
第三和第四是构造函数
第五onCreate是进行一些预处理,比如占多大空间,弹出来显示的时候在屏幕的那个位置等。
第六就是写接口和设置方法(其实我想Dialog应该有的啊,但是改了之后又不行,也没有时间研究,所以索性就没改了)。
第七就是设置只要点击其他地方或者Dialog上面的按钮,弹窗就会消失。

2.按钮

其实添加两个按钮,但是只有保存按钮才有响应。

在MainActivity.java中添加重写的方法,当点击保存时,我们先获取输入框对应的控件,然后再通过控件获取到输入框里面的内容,注意我们输入的数据是不带单位的,但是最后显示的时候要加上单位,所以先进行数据和单位的拼接。
然后判断拼接后的数据是否只有单位,如果只有单位则重新弹出输入界面,并且提示输入数据。
否则的判断输入的单价和里程是否为零(因为它们作为除数,不判断的话就会有输入错误的情况了),如果有一个是0,则重新弹出输入界面,并提示数据输入错误。
否则获取当前时间,然后调整double数据的格式,把数据添加进列表里。

@SuppressLint("NonConstantResourceId")
@Override
public void OnCenterItemClick(MyDialog dialog, View view) {
    switch (view.getId()){
        case R.id.btn_save:
            //获取控件
            EditText edit_amount = dialog.findViewById(R.id.edit_amount);//金额
            EditText edit_mileage = dialog.findViewById(R.id.edit_mileage);//里程
            EditText edit_unitPrice = dialog.findViewById(R.id.edit_unitPrice);//单价
            //拼数据
            String amount_unit = this.getResources().getString(R.string.txt_amount_unit);
            String mileage_unit = this.getResources().getString(R.string.txt_mileage_unit);
            String unitPrice_unit = this.getResources().getString(R.string.txt_unitPrice_unit);
            String oilConsumption_unit = this.getResources().getString(R.string.txt_oilConsumption_unit);

            String amount = edit_amount.getText().toString() +
                    this.getResources().getString(R.string.txt_amount_unit);
            String mileage = edit_mileage.getText().toString() +
                    this.getResources().getString(R.string.txt_mileage_unit);
            String unitPrice = edit_unitPrice.getText().toString() +
                    this.getResources().getString(R.string.txt_unitPrice_unit);

            if(amount.equals(amount_unit) ||
                    mileage.equals(mileage_unit) ||
                    unitPrice.equals(unitPrice_unit) ){
                Toast.makeText(this, "请输入数据!", Toast.LENGTH_SHORT).show();
                dialog.show();
                break;
            }
            double amountValue = Double.parseDouble(edit_amount.getText().toString());
            double unitPriceValue = Double.parseDouble(edit_mileage.getText().toString());
            double mileageValue = Double.parseDouble(edit_mileage.getText().toString());
            if(unitPriceValue == 0 || mileageValue == 0){
                Toast.makeText(this, "输入的数据有误!", Toast.LENGTH_SHORT).show();
                dialog.show();
                break;
            }

            Date date = new Date();
            @SuppressLint("SimpleDateFormat") SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy年MM月dd日 EEEE hh:mm:ss");
            String edit_date = dateFormat.format(date);
            double oilConsumptionValue = (amountValue / unitPriceValue / mileageValue);
            @SuppressLint("DefaultLocale") String oilConsumption = String.format("%.2f",oilConsumptionValue) +
                    oilConsumption_unit;
            //添加数据
            Data data = new Data();
            data.setImage(R.drawable.image);
            data.setAmount(amount);
            data.setMileage(mileage);
            data.setUnitPrice(unitPrice);
            data.setOilConsumption(oilConsumption);
            data.setDateTime(edit_date);

            if(isAdd){
                myAdapter.add(data);
            }
            else{
                myAdapter.updateListItem(data,position);
            }
            dataChange++;
            break;
        case R.id.btn_cancel:
    }
}
  • 0
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

大唐不良猿

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值