选择时间对话框编写
作者:@kuaiquxie
作者的github:https://github.com/bitebita
本文为作者原创,如需转载,请注明出处:https://www.cnblogs.com/dzwj/p/15762916.html
package com.example.easycash.utils; import android.app.Dialog; import android.content.Context; import android.os.Bundle; import android.os.Handler; import android.os.Message; import android.view.Display; import android.view.Gravity; import android.view.View; import android.view.Window; import android.view.WindowManager; import android.view.inputmethod.InputMethodManager; import android.widget.Button; import android.widget.EditText; import androidx.annotation.NonNull; import com.example.easycash.R; public class BeiZhuDialog extends Dialog implements View.OnClickListener { EditText et; Button cancelBtn,ensureBtn; OnEnsureListener onEnsureListener; // 设定回调接口的方法 public void setOnEnsureListener(OnEnsureListener onEnsureListener) { this.onEnsureListener = onEnsureListener; } public BeiZhuDialog(@NonNull Context context) { super(context); } @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.dialog_beizhu);//设置对话框显示布局 et = findViewById(R.id.dialog_beizhu_et); cancelBtn = findViewById(R.id.dialog_beizhu_btn_cancel); ensureBtn = findViewById(R.id.dialog_beizhu_btn_ensure); cancelBtn.setOnClickListener(this); ensureBtn.setOnClickListener(this); } public interface OnEnsureListener{ public void onEnsure(); } @Override public void onClick(View v) { switch (v.getId()) { case R.id.dialog_beizhu_btn_cancel: cancel(); break; case R.id.dialog_beizhu_btn_ensure: if (onEnsureListener!=null) { onEnsureListener.onEnsure(); } break; } } // 获取输入数据的方法 public String getEditText(){ return et.getText().toString().trim(); } /* 设置Dialog的尺寸和屏幕尺寸一致*/ public void setDialogSize(){ // 获取当前窗口对象 Window window = getWindow(); // 获取窗口对象的参数 WindowManager.LayoutParams wlp = window.getAttributes(); // 获取屏幕宽度 Display d = window.getWindowManager().getDefaultDisplay(); wlp.width = (int)(d.getWidth()); //对话框窗口为屏幕窗口 wlp.gravity = Gravity.BOTTOM; window.setBackgroundDrawableResource(android.R.color.transparent); window.setAttributes(wlp); handler.sendEmptyMessageDelayed(1,100); } Handler handler = new Handler(){ @Override public void handleMessage(@NonNull Message msg) { //自动弹出软键盘的方法 InputMethodManager inputMethodManager = (InputMethodManager) getContext().getSystemService(Context.INPUT_METHOD_SERVICE); inputMethodManager.toggleSoftInput(0,InputMethodManager.HIDE_NOT_ALWAYS); } }; }
package com.example.easycash.utils; 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.example.easycash.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); } } }
package com.example.easycash.frag_record; import android.inputmethodservice.KeyboardView; import android.os.Bundle; import androidx.annotation.Nullable; import androidx.fragment.app.Fragment; import android.text.TextUtils; import android.view.LayoutInflater; import android.view.View; import android.view.ViewGroup; import android.widget.AdapterView; import android.widget.EditText; import android.widget.GridView; import android.widget.ImageView; import android.widget.TextView; import com.example.easycash.R; import com.example.easycash.db.AccountBean; import com.example.easycash.db.DBManager; import com.example.easycash.db.TypeBean; import com.example.easycash.utils.BeiZhuDialog; import com.example.easycash.utils.KeyBoardUtils; import com.example.easycash.utils.SelectTimeDialog; import java.text.SimpleDateFormat; import java.util.ArrayList; import java.util.Calendar; import java.util.Date; import java.util.List; /** * 记录页面当中的支出模块 */ public abstract class BaseRecordFragment extends Fragment implements View.OnClickListener { KeyboardView keyboardView; EditText moneyEt; ImageView typeIv; TextView typeTv,beizhuTv,timeTv; GridView typeGv; List<TypeBean>typeList; TypeBaseAdapter adapter; AccountBean accountBean; //将需要插入到记账本当中的数据保存成对象的形式 @Override public void onCreate(@Nullable Bundle savedInstanceState) { super.onCreate(savedInstanceState); accountBean = new AccountBean(); //创建对象 accountBean.setTypename("其他"); accountBean.setsImageId(R.mipmap.ic_qita_fs); } @Override public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { // Inflate the layout for this fragment View view = inflater.inflate(R.layout.fragment_outcome, container, false); initView(view); setInitTime(); //给GridView填充数据的方法 loadDataToGV(); setGVListener(); //设置GridView每一项的点击事件 return view; } /* 获取当前时间,显示在timeTv上*/ private void setInitTime() { Date date = new Date(); SimpleDateFormat sdf = new SimpleDateFormat("yyyy年MM月dd日 HH:mm"); String time = sdf.format(date); timeTv.setText(time); accountBean.setTime(time); Calendar calendar = Calendar.getInstance(); int year = calendar.get(Calendar.YEAR); int month = calendar.get(Calendar.MONTH)+1; int day = calendar.get(Calendar.DAY_OF_MONTH); accountBean.setYear(year); accountBean.setMonth(month); accountBean.setDay(day); } /* 设置GridView每一项的点击事件*/ private void setGVListener() { typeGv.setOnItemClickListener(new AdapterView.OnItemClickListener() { @Override public void onItemClick(AdapterView<?> parent, View view, int position, long id) { adapter.selectPos = position; adapter.notifyDataSetInvalidated(); //提示绘制发生变化了 TypeBean typeBean = typeList.get(position); String typename = typeBean.getTypename(); typeTv.setText(typename); accountBean.setTypename(typename); int simageId = typeBean.getSimageId(); typeIv.setImageResource(simageId); accountBean.setsImageId(simageId); } }); } /* 给GridView填出数据的方法*/ public void loadDataToGV() { typeList = new ArrayList<>(); adapter = new TypeBaseAdapter(getContext(), typeList); typeGv.setAdapter(adapter); } private void initView(View view) { keyboardView = view.findViewById(R.id.frag_record_keyboard); moneyEt = view.findViewById(R.id.frag_record_et_money); typeIv = view.findViewById(R.id.frag_record_iv); typeGv = view.findViewById(R.id.frag_record_gv); typeTv = view.findViewById(R.id.frag_record_tv_type); beizhuTv = view.findViewById(R.id.frag_record_tv_beizhu); timeTv = view.findViewById(R.id.frag_record_tv_time); beizhuTv.setOnClickListener(this); timeTv.setOnClickListener(this); //让自定义软键盘显示出来 KeyBoardUtils boardUtils = new KeyBoardUtils(keyboardView, moneyEt); boardUtils.showKeyboard(); //设置接口,监听确定按钮按钮被点击了 boardUtils.setOnEnsureListener(new KeyBoardUtils.OnEnsureListener() { @Override public void onEnsure() { //获取输入钱数 String moneyStr = moneyEt.getText().toString(); if (TextUtils.isEmpty(moneyStr)||moneyStr.equals("0")) { getActivity().finish(); return; } float money = Float.parseFloat(moneyStr); accountBean.setMoney(money); //获取记录的信息,保存在数据库当中 saveAccountToDB(); // 返回上一级页面 getActivity().finish(); } }); } /* 让子类一定要重写这个方法*/ public abstract void saveAccountToDB(); @Override public void onClick(View v) { switch (v.getId()) { case R.id.frag_record_tv_time: showTimeDialog(); break; case R.id.frag_record_tv_beizhu: showBZDialog(); break; } } /* 弹出显示时间的对话框*/ 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); } }); } /* 弹出备注对话框*/ public void showBZDialog(){ final BeiZhuDialog dialog = new BeiZhuDialog(getContext()); dialog.show(); dialog.setDialogSize(); dialog.setOnEnsureListener(new BeiZhuDialog.OnEnsureListener() { @Override public void onEnsure() { String msg = dialog.getEditText(); if (!TextUtils.isEmpty(msg)) { beizhuTv.setText(msg); accountBean.setBeizhu(msg); } dialog.cancel(); } }); } }
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· winform 绘制太阳,地球,月球 运作规律
· AI与.NET技术实操系列(五):向量存储与相似性搜索在 .NET 中的实现
· 超详细:普通电脑也行Windows部署deepseek R1训练数据并当服务器共享给他人
· 上周热点回顾(3.3-3.9)
· AI 智能体引爆开源社区「GitHub 热点速览」