zoukankan      html  css  js  c++  java
  • 家庭记账本(三)记录页面的完善

      昨天我们已经可以让记录页面显示出来。可是添加备注与时间的地方依然是写死的,我们需要可以让用户自定义备注信息和选择时间。我们今天继续对记录页面信息进行完善。

      我们可以对备注与时间添加点击事件,分别弹出对话框进行对于备注与时间的修改。

      下面先编写备注的对话框。我们新建dialog_mark.xml进行备注对话框的绘制。

    <?xml version="1.0" encoding="utf-8"?>
    <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
        android:layout_width="match_parent" android:layout_height="wrap_content"
        android:padding="10dp"
        android:background="@color/white">
    
        <TextView
            android:id="@+id/dialog_mark_tv"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:text="@string/add_remark"
            android:textSize="16sp"
            android:textColor="@color/black"/>
    
        <EditText
            android:id="@+id/dialog_mark_et"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:layout_below="@id/dialog_mark_tv"
            android:layout_marginTop="10dp"
            android:layout_marginBottom="20dp"
            android:background="@color/white">
            <requestFocus/>
        </EditText>
    
        <LinearLayout
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:orientation="horizontal"
            android:layout_below="@id/dialog_mark_et"
            android:padding="10dp">
    
            <Button
                android:id="@+id/dialog_mark_btn_cancel"
                android:layout_width="10dp"
                android:layout_height="wrap_content"
                android:layout_weight="1"
                android:padding="10dp"
                android:text="@string/cancel"
                android:textColor="@color/green_006400"
                android:background="@drawable/dialog_btn_bg"/>
    
            <Button
                android:id="@+id/dialog_mark_btn_ensure"
                android:layout_width="10dp"
                android:layout_height="wrap_content"
                android:layout_weight="1"
                android:padding="10dp"
                android:background="@drawable/main_recordbtn_bg"
                android:text="@string/ensure"
                android:textColor="@color/white"/>
    
        </LinearLayout>
    </RelativeLayout>

       新建MarkDialog对此对话框进行设置

    public class MarkDialog extends Dialog implements View.OnClickListener {
    
        EditText et;
        Button btn_cancel;
        Button btn_ensure;
        OnEnsureListener onEnsureListener;
    
        public void setOnEnsureListener(OnEnsureListener onEnsureListener) {
            this.onEnsureListener = onEnsureListener;
        }
    
        public MarkDialog(@NonNull Context context) {
            super(context);
        }
    
        public interface OnEnsureListener {
            public void onEnsure();
        }
        @Override
        public void onClick(View v) {
            switch (v.getId()) {
                case R.id.dialog_mark_btn_cancel:
                    cancel();
                    break;
                case R.id.dialog_mark_btn_ensure:
                    if (onEnsureListener!=null) {
                        onEnsureListener.onEnsure();
                    }
                    break;
            }
        }
    
        @Override
        protected void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            //设置对话框显示布局
            setContentView(R.layout.dialog_mark);
    
            et = findViewById(R.id.dialog_mark_et);
            btn_cancel = findViewById(R.id.dialog_mark_btn_cancel);
            btn_ensure = findViewById(R.id.dialog_mark_btn_ensure);
            btn_ensure.setOnClickListener(this);
            btn_cancel.setOnClickListener(this);
        }
    
        public String getText() {
            return et.getText().toString().trim();
        }
    
        /*设置dialog尺寸和屏幕尺寸一致*/
    
        public void setDialogSize() {
            /*获取当前窗口对象*/
            Window window = getWindow();
            /*获取窗口对象参数*/
            WindowManager.LayoutParams attributes = window.getAttributes();
            /*获取屏幕宽度*/
            Display defaultDisplay = window.getWindowManager().getDefaultDisplay();
            /*对话框窗口为屏幕窗口*/
            attributes.width = (int) defaultDisplay.getWidth();
    
            attributes.gravity = Gravity.BOTTOM;
            window.setBackgroundDrawableResource(android.R.color.transparent);
            window.setAttributes(attributes);
            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);
            }
        };
    }

      这里注意一下自动弹出软键盘需要做延时处理,否则不能自动弹出。

      下面是dialog_calendar.xml

    <?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">
    
        <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_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_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/green_006400"
                android:layout_marginRight="20dp"
                />
    
            <Button
                android:id="@+id/dialog_time_btn_ensure"
                android:layout_width="80dp"
                android:layout_height="wrap_content"
                android:text="@string/cancel"
                android:textColor="@color/green_006400"/>
        </LinearLayout>
    </LinearLayout>

       

    /**
     * 在记录页面弹出时间对话框
     */
    public class SelectTimeDialog extends Dialog implements View.OnClickListener {
    
        EditText et_hour, et_minute;
        DatePicker datePicker;
        Button btn_ensure, btn_cancel;
    
        OnEnsureListener onEnsureListener;
    
        public void setOnEnsureListener(OnEnsureListener onEnsureListener) {
            this.onEnsureListener = onEnsureListener;
        }
    
        public interface OnEnsureListener{
            public void onEnsure(String time, int year, int month, int day);
        }
    
        public SelectTimeDialog(@NonNull Context context) {
            super(context);
        }
    
        @Override
        public void onClick(View v) {
            switch (v.getId()) {
                case R.id.dialog_time_btn_ensure:
    
                    int year = datePicker.getYear();
                    int month = datePicker.getMonth()+1;
                    int day = datePicker.getDayOfMonth();
    
                    String monthStr = String.valueOf(month);
                    if (month < 10) {
                        monthStr = "0"+month;
                    }
    
                    String dayStr = String.valueOf(day);
                    if (day < 10) {
                        dayStr = "0"+day;
                    }
    
                    /*获取输入的小时和分钟*/
                    String hourStr = et_hour.getText().toString();
                    String minuteStr = et_minute.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, day);
                    }
                    break;
                case R.id.dialog_time_btn_cancel:
                    cancel();
                    break;
            }
        }
    
        @Override
        protected void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.dialog_calendar);
    
            et_hour = findViewById(R.id.dialog_time_hour);
            et_minute = findViewById(R.id.dialog_time_minute);
            datePicker = findViewById(R.id.dialog_time_dp);
            btn_cancel = findViewById(R.id.dialog_time_btn_cancel);
            btn_ensure = findViewById(R.id.dialog_time_btn_ensure);
    
            btn_cancel.setOnClickListener(this);
            btn_ensure.setOnClickListener(this);
    
            hideDatePickerHeader();
        }
    
        /*隐藏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 layoutParams = rootView.getLayoutParams();
                layoutParams.width = ViewGroup.LayoutParams.WRAP_CONTENT;
                rootView.setLayoutParams(layoutParams);
    
                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);
            }
        }
    }

      对记录页面中的备注与时间添加点击事件。

        @Override
        public void onClick(View v) {
            switch (v.getId()) {
                case R.id.frag_record_tv_time:
                    showTimeDialog();
                    break;
                case R.id.frag_record_tv_mark:
                    showMarkDialog();
                    break;
            }
        }
    
        /*弹出备注对话框*/
        public void showMarkDialog() {
            MarkDialog dialog = new MarkDialog(getContext());
            dialog.show();
            dialog.setDialogSize();
    
            dialog.setOnEnsureListener(new MarkDialog.OnEnsureListener() {
                @Override
                public void onEnsure() {
                    String text = dialog.getText();
    
                    if (!TextUtils.isEmpty(text)) {
                        tv_mark.setText(text);
    
                        //TODO:将bean对象也做修改
    
                    }
                    dialog.cancel();
                }
            });
        }
    
        /*弹出时间对话框*/
        public void showTimeDialog() {
            SelectTimeDialog selectTimeDialog = new SelectTimeDialog(getContext());
            selectTimeDialog.show();
    
            selectTimeDialog.setOnEnsureListener(new SelectTimeDialog.OnEnsureListener() {
    
                @Override
                public void onEnsure(String time, int year, int month, int day) {
                    tv_time.setText(time);
              //TODO:将bean对象也做修改
            } 
         });
      }

      进行到这里我们记录页面也就写好了。当我们填写了数据信息之后怎样进行保存,明天将实现把录入信息保存至数据库。

  • 相关阅读:
    Eos开发——构造查询条件
    随记
    Spring的三种通过XML实现DataSource注入方式
    事务处理
    Spring AOP实例——异常处理和记录程序执行时间
    输出日志实例改成用Spring的AOP来实现
    用ProxyFactoryBean创建AOP代理
    Spring的通知(Advice)
    Spring的3种切入点PointCut实现
    学习AOP之JAVA的代理机制
  • 原文地址:https://www.cnblogs.com/Gazikel/p/14327289.html
Copyright © 2011-2022 走看看