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:
}
}