TimePicker不会从用户输入更新

时间:2013-05-16 15:27:17

标签: android datetimepicker

我有一个使用自定义dateTime Picker的应用。当用户选择时间并单击SET按钮时,它将获得在微调器上设置的时间。我的应用程序检查时间,如果根据某些标准不适合我再次显示微调器。

问题是当用户在第二次或以后更改微调器的时间时,仍然设置初始时间。我怎样才能从日期时间对象中反映的微调器获得时间?

我已经尝试在TPic对象上调用TPic.getCurrentHour等以及refreshDrawableState但它仍然无效。有什么想法吗?

Button ShowDTPicker;
        Button ShowDatePicker;
        Button ShowTimePicker;
        Button Set;
        Button ReSet;
        Button Cancel;
        DatePicker DPic;
        TimePicker TPic;
        TextView Date;
        private ViewSwitcher switcher;
        static final int DATE_TIME_DIALOG_ID = 999;
        Dialog dialog;

        public void showDateTimeDialog(){


        //final Calendar c = Calendar.getInstance();

        final SimpleDateFormat dfDate = new SimpleDateFormat("dd-MMM-yyyy HH:mm");



            dialog = new Dialog(NfcscannerActivity.this);
            dialog.setContentView(R.layout.datetimepicker);
            switcher = (ViewSwitcher) dialog.findViewById(R.id.DateTimePickerVS);

            TPic = (TimePicker) dialog.findViewById(R.id.TimePicker);
            DPic = (DatePicker) dialog.findViewById(R.id.DatePicker);
            TPic.setIs24HourView(true);



            ShowDatePicker = ((Button) dialog.findViewById(R.id.SwitchToDate));
            ShowDatePicker.setOnClickListener(new OnClickListener() {
                @Override
                public void onClick(View v) {
                    switcher.showPrevious();
                    ShowDatePicker.setEnabled(false);
                    ShowTimePicker.setEnabled(true);
                }
            });
            ShowTimePicker = ((Button) dialog.findViewById(R.id.SwitchToTime));
            ShowTimePicker.setOnClickListener(new OnClickListener() {
                @Override
                public void onClick(View v) {
                    switcher.showNext();
                    ShowDatePicker.setEnabled(true);
                    ShowTimePicker.setEnabled(false);
                }
            });

            Set = ((Button) dialog.findViewById(R.id.SetDateTime));
            Set.setOnClickListener(new OnClickListener() {
                @Override
                public void onClick(View v) {

                    Calendar c = Calendar.getInstance();
                    c.set(DPic.getYear(),  DPic.getMonth(), DPic.getDayOfMonth(), TPic.getCurrentHour(), TPic.getCurrentMinute());
                    Log.e(TAG, "TPic hour and minute = " + TPic.getCurrentHour() + " " +  TPic.getCurrentMinute());
                    timeSetOnSpinner = new DateTime(c);


................
................
...............
            //check if time is suitable, if not call showDateTimeDialog() again


                }
            });
            ReSet = ((Button) dialog.findViewById(R.id.ResetDateTime));
            ReSet.setOnClickListener(new OnClickListener() {
                @Override
                public void onClick(View v) {
                    Calendar c = Calendar.getInstance();
                    DPic.updateDate(c.get(Calendar.YEAR), c.get(Calendar.MONTH), c.get(Calendar.DAY_OF_MONTH));
                    TPic.setCurrentHour(c.get(Calendar.HOUR_OF_DAY));
                    TPic.setCurrentMinute(c.get(Calendar.MINUTE));
                }
            });
            Cancel = ((Button) dialog.findViewById(R.id.CancelDialog));
            Cancel.setOnClickListener(new OnClickListener() {
                @Override
                public void onClick(View v) {

                    dialog.cancel();



                }
            });

            dialog.setTitle("Please enter time of last logout");

            try{
                ReSet.performClick();
            dialog.show();
            }catch(Exception e){
                //ignore
            }
            Log.e(TAG,"Just executed dialog.show() and at the end of showDateTimeDialog method");
        }//showDateTimeDialog()

        @Override
        protected Dialog onCreateDialog(int id) {
            switch (id) {
            case DATE_TIME_DIALOG_ID:

                return dialog;
            }
            return null;
        }

<?xml version="1.0" encoding="UTF-8"?>
<RelativeLayout 

    android:padding="5dip" 
    android:fitsSystemWindows="true" 
    android:layout_height="wrap_content" 
    android:layout_width="fill_parent" 
    android:id="@+id/DateTimePicker" 
    xmlns:android="http://schemas.android.com/apk/res/android">

    <LinearLayout 

        android:layout_height="wrap_content" 
        android:layout_width="fill_parent" 
        android:id="@+id/ViewSwitchButtons" 
        android:layout_marginBottom="5dip"> 

        <Button 
            android:layout_height="wrap_content" 
            android:layout_width="0dip" 
            android:id="@+id/SwitchToDate" 
            android:text="Set date" 
            android:enabled="false" 
            android:layout_weight="1"/>

        <Button 
            android:layout_height="wrap_content" 
            android:layout_width="0dip" 
            android:id="@+id/SwitchToTime" 
            android:text="Set time" 
            android:layout_weight="1"/>

        </LinearLayout> 

        <ViewSwitcher 
            android:layout_height="wrap_content" 
            android:layout_width="fill_parent" 
            android:id="@+id/DateTimePickerVS" 
            android:layout_below="@+id/ViewSwitchButtons" 
            android:outAnimation="@android:anim/fade_out" 
            android:inAnimation="@android:anim/fade_in"> 



                <LinearLayout 
                    android:layout_height="fill_parent" 
                    android:layout_width="fill_parent" 
                    android:id="@+id/TimeLayout" 
                    android:fillViewport="true"> 

                    <TimePicker 
                        android:layout_height="wrap_content" 
                        android:layout_width="fill_parent" 
                        android:id="@+id/TimePicker" 
                        android:layout_marginRight="5dip" 
                        android:layout_marginLeft="5dip"/>

                    </LinearLayout> 

                <LinearLayout android:layout_height="fill_parent" 
                android:layout_width="fill_parent" 
                android:id="@+id/DateLayout" 
                android:fillViewport="true"> 

                <DatePicker 
                    android:layout_height="wrap_content" 
                    android:layout_width="fill_parent" 
                    android:id="@+id/DatePicker" 
                    android:layout_marginRight="5dip" 
                    android:layout_marginLeft="5dip"/>

                </LinearLayout> 

                    </ViewSwitcher> 

                    <LinearLayout 
                        android:layout_height="wrap_content" 
                        android:layout_width="fill_parent" 
                        android:id="@+id/ControlButtons" 
                        android:layout_below="@+id/DateTimePicker" 
                        android:paddingTop="185dip"> 

                        <Button 
                            android:layout_height="wrap_content" 
                            android:layout_width="0dip" 
                            android:id="@+id/SetDateTime" 
                            android:text="@android:string/ok" 
                            android:layout_weight="1"/> 

                            <Button 
                                android:layout_height="wrap_content" 
                                android:layout_width="0dip" 
                                android:id="@+id/ResetDateTime" 
                                android:text="Reset" 
                                android:layout_weight="1"/>

                            <Button 
                                android:layout_height="wrap_content" 
                                android:layout_width="0dip" 
                                android:id="@+id/CancelDialog" 
                                android:text="@android:string/cancel" 
                                android:layout_weight="1"/> 

                                </LinearLayout> 

                                </RelativeLayout>

3 个答案:

答案 0 :(得分:3)

Android: How to get the time from a TimePicker when it is typed in

似乎DatePicker或TimePicker在焦点消失时更新自己的值。在设置按钮OnClickListener中使用clearFocus()方法。

我认为代码会是这样的:

Set = ((Button) dialog.findViewById(R.id.SetDateTime));
Set.setOnClickListener(new OnClickListener() {
    @Override
    public void onClick(View v) {
        DPic.clearFocus();
        TPic.clearFocus();

        Calendar c = Calendar.getInstance();
        c.set(DPic.getYear(),  DPic.getMonth(), DPic.getDayOfMonth(),
                TPic.getCurrentHour(), TPic.getCurrentMinute());
        Log.e(TAG, "TPic hour and minute = " + TPic.getCurrentHour()
                + " " +  TPic.getCurrentMinute());
        timeSetOnSpinner = new DateTime(c);
    }
});

请注意ShowDTPickerShowDatePickerShowTimePickerSetReSetCancelDPic,{{ 1}},TPic未关注Java naming conventions。带有大写首字母的名称用于classes or interfaces(并且Date类也存在!)。如果它们是公共类变量,则它们的每个首字母都应该是小写的。也可以使用Date代替mSwitcher,因为它是私有类变量。

答案 1 :(得分:1)

var timePicker : TimePicker = findViewById(R.id.timePicker)
timePicker.setOnTimeChangedListener(object:TimePicker.OnTimeChangedListener { override fun onTimeChanged(p0: TimePicker?, hour: Int,minute: Int) {


  // get hour and minute

 } })

答案 2 :(得分:0)

我遇到同样的问题(虽然 asp.net )...我知道这是因为在回发期间没有考虑新的选定时间所以更新甚至没有发生...我也知道我与日期选择器有相同的问题并解决它保存隐藏字段中的值,我正在后面的代码中检索。 所以,基本上它在这里是相同的,我们需要javascript函数来存储隐藏字段中的值以便稍后检索 可以使用提交按钮上的OnClientClick操作触发此功能。 但我有问题找到如何在javascript中从timePicker获取值我没有找到准确的文档。 我希望这有帮助,如果您找到任何解决方案,请随时关注我们。