CalendarView перестает прокручиваться при вложении в Scrollview в Android
Я вложил календарь в ScrollView
, Моя проблема начинается с увеличения высоты зрения. Я могу прокручивать календарные месяцы по вертикали, но когда scrollview
полоса прокрутки приходит не позволяет прокрутить календарь. Вместо прокрутки календаря весь вид прокручивается вверх или вниз.
<?xml version="1.0" encoding="utf-8"?>
<ScrollView xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:fillViewport="true">
<LinearLayout android:orientation="vertical" android:id="@+id/ReminderLayout"
android:layout_width="fill_parent" android:layout_height="wrap_content" >
<LinearLayout
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:orientation="vertical" >
<EditText
android:id="@+id/TaskName"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:inputType="textCapWords"
android:singleLine="true"
android:textSize="26.0sp" />
<View
android:id="@+id/seperator"
android:layout_width="fill_parent"
android:layout_height="1dip" />
<TextView
android:id="@+id/lblNotes"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:text="Notes" />
<EditText
android:id="@+id/TaskNotes"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:inputType="textMultiLine"
android:textSize="26.0sp" />
<View
android:id="@+id/seperator"
android:layout_width="fill_parent"
android:layout_height="1dip" />
<TextView
android:id="@+id/lblReminder"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:text="Reminder" />
</LinearLayout>
<LinearLayout android:orientation="horizontal"
android:layout_width="fill_parent" android:layout_height="wrap_content">"
<CalendarView
android:id="@+id/calendarReminder"
android:layout_width="fill_parent"
android:layout_height="250dp"
android:scrollbars="vertical"
android:isScrollContainer="true" />
</LinearLayout>
<LinearLayout
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:orientation="horizontal"
>
<TimePicker
android:id="@+id/timePickerReminder"
android:layout_width="fill_parent"
android:layout_height="match_parent"
android:gravity="center" />
</LinearLayout>
<LinearLayout android:orientation="vertical"
android:layout_width="fill_parent" android:layout_height="wrap_content" >
<View android:id="@+id/seperator" android:layout_width="fill_parent" android:layout_height="1dip"/>
<TextView android:id="@+id/ReminderTime" android:layout_width="fill_parent" android:layout_height="wrap_content"
android:text="On Time" android:paddingLeft="20dip"/>
<View android:id="@+id/seperator" android:layout_width="fill_parent" android:layout_height="1dip"/>
<TextView android:id="@+id/Recurring" android:layout_width="fill_parent" android:layout_height="wrap_content"
android:text="Only Once" android:paddingLeft="20dip"/>
</LinearLayout>
</LinearLayout>
</ScrollView>
2 ответа
Я нашел ответ на эту проблему здесь: /questions/23411152/android-timepicker-stil-kolesa-ne-otvechaet-pravilno-na-zhestyi-schelchka-v-scrollview/23411161#23411161
По сути, вам необходимо реализовать собственный CalendarView и переопределить метод onInterceptTouchEvent. Я сделал это следующим образом:
package com.example.app.views;
public class CalendarViewScrollable extends CalendarView {
public CalendarViewScrollable(Context context) {
super(context);
}
public CalendarViewScrollable(Context context, AttributeSet attrs) {
super(context, attrs);
}
public CalendarViewScrollable(Context context, AttributeSet attrs,
int defStyle) {
super(context, attrs, defStyle);
}
@Override
public boolean onInterceptTouchEvent(MotionEvent ev)
{
if (ev.getActionMasked() == MotionEvent.ACTION_DOWN)
{
ViewParent p = getParent();
if (p != null)
p.requestDisallowInterceptTouchEvent(true);
}
return false;
}
}
Затем просто используйте это представление в файле макета XML:
<com.example.app.views.CalendarViewScrollable
android:id="@+id/datePicker1"
android:layout_width="400dp"
android:layout_height="400dp"
/>
Вот одно из решений: вы можете реализовать собственный ScrollView, который будет перехватывать только вертикаль.
@Override
public boolean onInterceptTouchEvent(MotionEvent ev) {...}
"onInterceptTouchEvent" вернет false для горизонтального пролистывания, поэтому горизонтальное перелистывание будет включено для CalendarView.
Вы можете прочитать больше об этом heree: /questions/25465775/horizontalscrollview-v-scrollview-touch-handling/25465788#25465788