繁体   English   中英

Android EditText字段设置为当前时间,而不是用户输入的时间

[英]Android EditText field being set to current time and not time inputed by user

我有一个将DatePicker和TimePicker对话包装到单个视图寻呼机视图中的类,以便用户可以选择日期和时间。 此方法返回日历对象。

public class DialogUtils {
    public static Calendar showDateAndTimeDialog(final Context context) {

        View view = LayoutInflater.from(context).inflate(R.layout.dialog_date_time,null, false);
        final DatePicker datePicker = (DatePicker) view.findViewById(R.id.date_picker);
        final TimePicker timePicker = (TimePicker) view.findViewById(R.id.time_picker);
        final ViewPager viewPager = (ViewPager) view.findViewById(R.id.view_pager);
        final Calendar calendar = Calendar.getInstance();
        viewPager.setAdapter(new PagerAdapter() {

            @Override
            public Object instantiateItem(ViewGroup container, int position) {
                return viewPager.getChildAt(position);
            }

            @Override
            public CharSequence getPageTitle(int position) {
                switch (position) {
                    case 0:
                        return "Date";
                    case 1:
                        return "Time";
                }
                return super.getPageTitle(position);
            }

            @Override
            public int getCount() {
                return viewPager.getChildCount();
            }

            @Override
            public boolean isViewFromObject(View view, Object object) {
                return view == object;
            }
        });
        final TabLayout layoutTab = (TabLayout) view.findViewById(R.id.layout_tab);
        layoutTab.setupWithViewPager(viewPager);

        final AlertDialog dateAndTimeDialog = new AlertDialog.Builder(context)
                .setView(view)
                .setPositiveButton("OK", null)
                .setNegativeButton("Cancel", null)
                .create();
        dateAndTimeDialog.setOnShowListener(new DialogInterface.OnShowListener() {
            @Override
            public void onShow(final DialogInterface dialog) {

                /*
                    We override the default BUTTON_POSITIVE OnClickListener to prevent the dialog
                    from dismissing when the user presses OK
                 */

                dateAndTimeDialog.getButton(AlertDialog.BUTTON_POSITIVE).setOnClickListener(
                        new View.OnClickListener() {

                            public void onClick(View v) {
                                if (viewPager.getCurrentItem() == 0) {
                                    viewPager.setCurrentItem(1);
                                    return;
                                }

                                calendar.set(Calendar.MONTH, datePicker.getMonth());
                                calendar.set(Calendar.DAY_OF_MONTH, datePicker.getDayOfMonth());
                                calendar.set(Calendar.YEAR, datePicker.getYear());

                                calendar.set(Calendar.HOUR_OF_DAY, timePicker.getCurrentHour());
                                calendar.set(Calendar.MINUTE, timePicker.getCurrentMinute());

                                // We must dismiss the dialog as we have overriden the default behavior
                                dialog.dismiss();
                            }
                        });
            }
        });
        dateAndTimeDialog.show();
        return calendar;
    }
}

这在我的Activity类的两个地方调用。 首先

public Calendar launchDateAndTimePicker(View view) {
       return DialogUtils.showDateAndTimeDialog(this);
    }

以及在我的Activity的onCreate方法中,例如点击监听器

mEditDueDate = ((EditText) findViewById(R.id.task_due_date));
        mEditDueDate.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                Calendar cal;
                cal = launchDateAndTimePicker(v);
                // Bitmask used to determine timestamp format
                int displayMask = DateUtils.FORMAT_SHOW_TIME | DateUtils.FORMAT_SHOW_DATE | DateUtils.FORMAT_SHOW_YEAR;

                // Resultant timestamp
                String timestamp = DateUtils.formatDateTime(getApplicationContext(), cal.getTimeInMillis(), displayMask);
                mEditDueDate.setText(timestamp);
            }
        });
    }

即使选择了新的日期和时间,我的EditText字段也会显示当前的日期和时间。 我觉得我初始化日历对象的方式破坏了Picker小部件设置的值。 我该如何从showDateAndTimeDialog返回的日历对象中提取日历值?

编辑解决方案

我更新了DialogUtils类,以在其构造函数中使用Activity并直接更新EditText字段。

public Activity editActivity;
    public static EditText mEditDueDate;

    public DialogUtils(Activity editActivity) {
        this.editActivity = editActivity;
    }

然后找到EditText字段

 mEditDueDate = (EditText) editActivity.findViewById(R.id.task_due_date);

然后更新EditText字段。

// Bitmask used to determine timestamp format
                                int displayMask = DateUtils.FORMAT_SHOW_TIME | DateUtils.FORMAT_SHOW_DATE | DateUtils.FORMAT_SHOW_YEAR;
                                String timestamp = DateUtils.formatDateTime(editActivity.getApplicationContext(), calendar.getTimeInMillis(), displayMask);
                                mEditDueDate.setText(timestamp);

                                // We must dismiss the dialog as we have overriden the default behavior
                                dialog.dismiss();

到提取时间戳并将其设置为EditText ,用户尚未输入日期。

你应该搬家

// Resultant timestamp
String timestamp = DateUtils.formatDateTime(getApplicationContext(), cal.getTimeInMillis(), displayMask);
mEditDueDate.setText(timestamp);

可以在周围的类中实现DialogInterface.OnClickListener.onClick

在构建对话框时,将侦听器添加到对话框的肯定按钮:

final AlertDialog dateAndTimeDialog = new AlertDialog.Builder(context)
            .setView(view)
            .setPositiveButton("OK", this)
            .setNegativeButton("Cancel", null)
            .create();

当然,您将使结果Calendar对象在OnClickListener中可用。

您要先返回日历,然后才能在其上设置选定的数据。

像这样异步尝试。

public class DialogUtils {
    public static void showDateAndTimeDialog(final Context context, final DateCallback dateCallback) {

        View view = LayoutInflater.from(context).inflate(R.layout.dialog_date_time,null, false);
        final DatePicker datePicker = (DatePicker) view.findViewById(R.id.date_picker);
        final TimePicker timePicker = (TimePicker) view.findViewById(R.id.time_picker);
        final ViewPager viewPager = (ViewPager) view.findViewById(R.id.view_pager);
        final Calendar calendar = Calendar.getInstance();
        viewPager.setAdapter(new PagerAdapter() {

            @Override
            public Object instantiateItem(ViewGroup container, int position) {
                return viewPager.getChildAt(position);
            }

            @Override
            public CharSequence getPageTitle(int position) {
                switch (position) {
                    case 0:
                        return "Date";
                    case 1:
                        return "Time";
                }
                return super.getPageTitle(position);
            }

            @Override
            public int getCount() {
                return viewPager.getChildCount();
            }

            @Override
            public boolean isViewFromObject(View view, Object object) {
                return view == object;
            }
        });
        final TabLayout layoutTab = (TabLayout) view.findViewById(R.id.layout_tab);
        layoutTab.setupWithViewPager(viewPager);

        final AlertDialog dateAndTimeDialog = new AlertDialog.Builder(context)
                .setView(view)
                .setPositiveButton("OK", null)
                .setNegativeButton("Cancel", null)
                .create();
        dateAndTimeDialog.setOnShowListener(new DialogInterface.OnShowListener() {
            @Override
            public void onShow(final DialogInterface dialog) {

                /*
                    We override the default BUTTON_POSITIVE OnClickListener to prevent the dialog
                    from dismissing when the user presses OK
                 */

                dateAndTimeDialog.getButton(AlertDialog.BUTTON_POSITIVE).setOnClickListener(
                        new View.OnClickListener() {

                            public void onClick(View v) {
                                if (viewPager.getCurrentItem() == 0) {
                                    viewPager.setCurrentItem(1);
                                    return;
                                }

                                calendar.set(Calendar.MONTH, datePicker.getMonth());
                                calendar.set(Calendar.DAY_OF_MONTH, datePicker.getDayOfMonth());
                                calendar.set(Calendar.YEAR, datePicker.getYear());

                                calendar.set(Calendar.HOUR_OF_DAY, timePicker.getCurrentHour());
                                calendar.set(Calendar.MINUTE, timePicker.getCurrentMinute());

                                // We must dismiss the dialog as we have overriden the default behavior
                                dialog.dismiss();

                                dateCallback.onDateSelected(calendar);
                            }
                        });
            }
        });
        dateAndTimeDialog.show();
    }

    private interface DateCallback {
        void onDateSelected(Calendar calendar);
    }
}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM