Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

TimePicker hour doesn't update after switching to 24h

For example when I create this timePicker(below) at 18:00, the timePicker's timeValue will be 06:00. At 19:44->07:44... So it doesn't move to the correct current hour after switching from AM/PM to 24h mode. How can I change that? My goal is that the timePicker shows the current time when it was created. Like it does when I use it in AM/PM mode.

TimePicker timePicker = (TimePicker) convertView.findViewById(R.id.time_picker);
timePicker.setIs24HourView(true);

Sry for the bad formulation, hope you can understand my question. Otherwise just ask.

UPDATE:

public class ChooseTimeViewDialog extends AlertDialog {

    protected Context context;


    public ChooseTimeViewDialog(final Context context) {
        super(context);     
        this.context = context;
    }

    public void onCreate(Bundle savedInstanceState) {
        LayoutInflater inflater = this.getLayoutInflater();

        View convertView = inflater.inflate(R.layout.dialog_choose_time_view, null);
        setContentView(convertView);
        setTitle(R.string.title_dialog_choose_time_view);

        final TimePicker taskTimePicker = (TimePicker) convertView.findViewById(R.id.dctv_task_time_picker);
        taskTimePicker.setIs24HourView(true);


        setButton(DialogInterface.BUTTON_POSITIVE, "Choose", new DialogInterface.OnClickListener() {
            @Override
            public void onClick(DialogInterface dialog, int which) {
                int hour = taskTimePicker.getCurrentHour();
                int minute = taskTimePicker.getCurrentMinute();

                Calendar cal = new GregorianCalendar();
                cal.set(0, 0, 0, hour, minute, 0);

                ((AddTaskViewActivity) context).setSelectedTime(cal.getTime());
            }
        });
        setButton(DialogInterface.BUTTON_NEUTRAL, "No time", new DialogInterface.OnClickListener() {
            @Override
            public void onClick(DialogInterface dialog, int which) {
                ((AddTaskViewActivity) context).setSelectedTime(null);
            }
        });

    }

}

XML:

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent" >

    <TimePicker
        android:id="@+id/dctv_task_time_picker"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_alignParentTop="true"
        android:layout_centerHorizontal="true" />

</RelativeLayout>

After I moved the initialiation to onCreate and used the setContentView(View), the background of the dialog is transparent, it's fullscreen and has no buttons..why?

like image 470
tyzess Avatar asked Dec 01 '12 18:12

tyzess


1 Answers

I can use timePicker.setCurrentHour(new Date().getHours()), but that's not the solution I want. It should be possible to solve it in a better way.

Looking at the source code, this is a bug that appeared sometime after API 10:

public void setIs24HourView(Boolean is24HourView) {
    if (mIs24HourView == is24HourView) {
        return;
    }
    mIs24HourView = is24HourView; 
    // cache the current hour since spinner range changes
    int currentHour = getCurrentHour();
    updateHourControl();
    // set value after spinner range is updated
    setCurrentHour(currentHour);
    updateAmPmControl();
}

The correct order is:

// cache the current hour since spinner range changes
int currentHour = getCurrentHour();
mIs24HourView = is24HourView;

Because getCurrentHour() relies on mIs24HourView to return 1-12 or 0-23...

But until the source code is updated and deployed, you don't have much of a choice. You need to call setCurrentHour() after setIs24HourView() yourself.

like image 163
Sam Avatar answered Oct 20 '22 14:10

Sam