Android Time Picker отображается в портретной ориентации и обрезается в альбомной ориентации

Я пытаюсь заставить средство выбора времени отображать полные часы в альбомной ориентации. TimePicker находится в GridLayout. Он не перекрывает экран как DialogFragment или TimePickerDialog.

В настоящее время это то, что он показывает в альбомной ориентации:

Отображается только время от времени

Как видите, нет ничего, с чем можно было бы выбрать время, только время по умолчанию. Я пытаюсь заставить его показывать часы, как в портрете (который работает):

Показано постоянное средство выбора

Схема выбора времени:

<package.name.ScrollableTimePicker
                android:id="@+id/time_picker"
                android:layout_height="wrap_content"
                android:layout_width="match_parent" />

Класс, расширяющий TimePicker:

public class ScrollableTimePicker extends TimePicker {

    public ScrollableTimePicker(Context context, AttributeSet attrs, int defStyle) {
        super(context, attrs, defStyle);
    }

    public ScrollableTimePicker(Context context, AttributeSet attrs) {
        super(context, attrs);
    }

    public ScrollableTimePicker(Context context) {
        super(context);
    }

    @Override
    public boolean onInterceptTouchEvent(MotionEvent ev) {
        // Keeps events to time picker
        if (ev.getActionMasked() == MotionEvent.ACTION_DOWN) {
            ViewParent p = getParent();
            if (p != null) {
                p.requestDisallowInterceptTouchEvent(true);
            }
        }

        return false;
    }
}

Я поискал в Интернете и нашел следующие сообщения, которые мне не помогли:

  1. Android TimePicker плохо отображается в ландшафтном режиме

У меня нет названия для выбора времени.

  1. ScrollView сражается с прокруткой TimePicker, Timepicker в результате не прокручивается

Он уже реализован

  1. https://code.google.com/p/android/issues/detail?id=201766

Пробовал код в манифесте, но все равно не работает.

ОБНОВЛЕНИЕ Как предложил Сиддеш, установка layout_height из TimePicker на 200dp работает, но обрезает портрет. Теперь портрет 200dp в высоту, но он обрезан, и пейзаж показан полностью:

Горизонтальный TimePicker с высотой 200dp полностью показан

Portrait TimePicker с высотой 200 dp, с наполовину обрезанным изображением.


person Moon Cheesez    schedule 21.10.2016    source источник
comment
лучше закрыть диалоговое окно datepickerdialog при изменении ориентации. Календарь по умолчанию делает то же самое, проверьте приложение календаря, чтобы установить будильник.   -  person siddhesh    schedule 21.10.2016
comment
@siddhesh Это не DatePickerDialog, это TimePicker (и не TimePickerDialog)   -  person Moon Cheesez    schedule 21.10.2016
comment
то же самое, чувак, пожалуйста, проверяй, когда ставишь будильник на свой мобильный, нажимаешь на таймер и поворачиваешь телефон, таймер отключается   -  person siddhesh    schedule 21.10.2016
comment
@siddhesh Значит, TimePicker закрывается, когда я поворачиваю телефон? Но почему все еще работает, когда я поворачиваюсь назад?   -  person Moon Cheesez    schedule 21.10.2016
comment
я не понял, что вы пытаетесь сказать, лучше использовать отклонить на таймпикере, чтобы отклонить   -  person siddhesh    schedule 21.10.2016
comment
@siddhesh Что ты хочешь, чтобы я уволил? TimePicker не находится в Dialog или DialogFragment. Это часть GridLayout. Он не перекрывает активность.   -  person Moon Cheesez    schedule 21.10.2016
comment
но представление, которое вы предоставляете, выглядит как диалоговое окно   -  person siddhesh    schedule 21.10.2016
comment
@siddhesh Это просто обрезанное изображение из моего GridLayout.   -  person Moon Cheesez    schedule 21.10.2016
comment
затем сделайте обходной путь, установленный android:layout_height=200dp или любой другой, он будет работать для scrolltimepicker   -  person siddhesh    schedule 21.10.2016


Ответы (1)


У меня тоже была эта проблема, когда TimePicker находился в ScrollView, ваш диагноз был полезен.

Вы можете программно установить высоту TimePicker в своей деятельности.

В onCreate() добавить:

TimePicker tp = (TimePicker) findViewById(R.id.time_picker);

// get display dimensions
Point p = new Point();
getWindowManager().getDefaultDisplay().getSize(p);

int newHeight;

if(p.x > p.y) {
    // if landscape, convert 200dp to px
    newHeight = (int) TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_DIP, 200, getResources().getDisplayMetrics());
} else {
    newHeight = WindowManager.LayoutParams.WRAP_CONTENT;
}

// set TimePicker height
tp.getLayoutParams().height = newHeight;
person Brian Griffiths    schedule 11.10.2017