У меня есть интересная проблема. У меня есть ListView, что я хочу поддерживать точный выбор строки и yoffset при изменении ориентации. В связи с этим я звоню:Есть ли способ ввода touchmode программно?
list.postDelayed(new Runnable() {
@Override
public void run() {
list.requestFocusFromTouch();
list.setSelectionFromTop(finalPosition, yoffset);
}
},100);
Похоже, что это очень просто и хорошо работает. Проблема в том, что когда я дважды меняю ориентацию (вернитесь к исходной ориентации, то есть пейзаж-> портрет-> альбомная), чем список покинул TouchMode, т.е. list.isInTouchMode() возвращает false (при первом изменении ориентации, списке .isInTouchMode() возвращает true, и все отлично, нажатие работает и т. д.). Таким образом, когда вы прокручиваете список в программном режиме с помощью setSelectionFromTop() и нажимаете на элемент в списке, не касаясь где-то еще в приложении, список перескакивает и прокручивает туда, где я нажимал, выделяя неправильный элемент. Это очень раздражает, и я, похоже, не могу найти решение. Любые идеи и предложения приветствуются.
Вызов list.requestFocusFromTouch(), похоже, не влияет на настройку TouchMode.
Дополнительная информация:. Android:To set an item as selected when the ListView opens?
Я нашел пост от Romain Guy «Всякий раз, когда вы прикасаетесь к экрану, в любом месте в телефоне, вы входите тронуть режим для всех приложений Это желаемое и ожидаемое поведение. "http://groups.google.com/group/android-developers/browse_thread/thread/590b02939d14675b/077ad77e4217e56e?lnk=gst&q=[android]+scroll+listview+not+in+touchmode#077ad77e4217e56e
Все, что я хочу сделать, это как-то попасть в TouchMode, не заставляя пользователя на самом деле прикасаться к устройству при втором изменении ориентации. Я попробовал list.dispatchTouchEvent() несколько раз. Его можно Посылаю неправильные события движения:
list.dispatchTouchEvent(MotionEvent.obtain(SystemClock.uptimeMillis(),
SystemClock.uptimeMillis(), MotionEvent.ACTION_DOWN ,
list.getWidth(), list.getHeight(), 0));
list.dispatchTouchEvent(MotionEvent.obtain(SystemClock.uptimeMillis(),
SystemClock.uptimeMillis(), MotionEvent.ACTION_MOVE ,
list.getWidth(), list.getHeight(), 0));
list.dispatchTouchEvent(MotionEvent.obtain(SystemClock.uptimeMillis(),
SystemClock.uptimeMillis(), MotionEvent.ACTION_UP ,
list.getWidth(), list.getHeight(), 0));
Другим вариантом было бы не понять, почему мы больше не в TouchMode. Я не переопределял onConfigurationChanged(), поэтому макет полностью перестраивается при каждом изменении ориентации.
Заранее благодарен!
Джаред
Btw Я извиняюсь за уродливого расстояние кода я представил. У Stackoverflow есть странное ограничение форматирования. - Мне удалось исправить проблемы с интервалом. Сейчас это выглядит нормально. =) –
Просто, чтобы быть ясным, установлен ли ваш список, чтобы использовать CHOICE_MODE_SINGLE, чтобы он мог сохранить последний выбранный элемент? – Gophermofur
Это так, но при изменении ориентации весь вид воссоздается. Я попытался изменить режим выбора на все возможные варианты без эффекта. –