HorizontalScrollView с прокруткой EditText при появлении клавиатуры
Я успешно создал список (LinearLayout), который содержит несколько динамических элементов / строк. Он наполнен контентом, полученным веб-сервисом. Одним из элементов в строке является HorizontalScrollView, который содержит переменное количество полей EditText.
Это означает, что все edittexts из всех строк (включая заголовок) могут прокручиваться с этим HorizontalScrollView.
Менеджер прокрутки обеспечит одновременное перемещение всех горизонтальных видов прокрутки. Так что это в основном прокручиваемый столбец в списке.
Проблема, с которой я сталкиваюсь, заключается в следующем.
Когда я выбираю представление EditText, оно показывает клавиатуру, что я и хочу. Но scrollManager срабатывает, поэтому он прокручивает все горизонтальные прокрутки до конца. Вместо того, чтобы сохранять фокусированный текст редактирования на экране, он переместится из поля зрения.
Мой ScrollManager OnScrollChanged
@Override
public void onScrollChanged(View sender, int l, int t, int oldl, int oldt) {
// avoid notifications while scroll bars are being synchronized
if (isSyncing)
return;
isSyncing = true;
// remember scroll type
if (l != oldl)
scrollType = SCROLL_HORIZONTAL;
else if (t != oldt)
scrollType = SCROLL_VERTICAL;
else {
// not sure why this should happen
isSyncing = false;
return;
}
// update clients
for (ScrollNotifier client : clients) {
View view = (View) client;
if (view == sender)
continue; // don't update sender
// scroll relevant views only
// TODO Add support for horizontal ListViews - currently weird things happen when ListView is being scrolled horizontally
if ((scrollType == SCROLL_HORIZONTAL && view instanceof HorizontalScrollView)
|| (scrollType == SCROLL_VERTICAL && view instanceof ScrollView)
|| (scrollType == SCROLL_VERTICAL && view instanceof ListView)) {
view.scrollTo(l, t);
}
}
isSyncing = false;
}
В конце я хочу, чтобы клавиатура появилась и прокрутка могла прокручиваться, но я хочу предотвратить событие горизонтальной прокрутки при появлении клавиатуры.
1 ответ
Я еще не проверял это, но вы должны быть в состоянии остановить распространение события касания к HorizontalScrollView, установив OnTouchListener в свой EditText и переопределив метод OnTouch следующим образом:
@Override
public boolean onTouch(View v, MotionEvent event)
{
Log.i("OnTouch", "Fired On Touch in " + v.getId());
// Do this on the down event too so it's not getting fired before up event
if(event.getAction() == MotionEvent.ACTION_DOWN)
{
// Disallow ScrollView to intercept touch events.
v.getParent().requestDisallowInterceptTouchEvent(true);
}
//only do this on the up event so you're not doing it for down too
if(event.getAction() == MotionEvent.ACTION_UP)
{
// Disallow ScrollView to intercept touch events.
v.getParent().requestDisallowInterceptTouchEvent(true);
}
//Keep going with the touch event to show the keyboard
v.onTouchEvent(event);
return true;
}