У меня есть ListView с некоторыми фокусируемыми компонентами внутри (в основном EditText
s). Да, я знаю, что это не совсем рекомендуется, но в целом почти все работает нормально, и фокус идет туда, куда должен идти (с несколькими настройками, которые мне пришлось кодировать). Во всяком случае, моя проблема заключается в том, что возникает странное состояние гонки при прокрутке списка пальцем, а затем внезапное использование трекбола, когда отображается клавиатура IME. Что-то должно выйти за пределы и быть переработано, после чего должен сработать метод offsetRectBetweenParentAndChild()
и выдать IllegalArgumentException
.
Проблема в том, что это исключение выбрасывается вне любого блока, в который я могу вставить try/catch (насколько мне известно). Таким образом, есть два действительных решения этого вопроса:
- Кто-то знает, почему возникает это исключение и как его предотвратить.
- Кто-то знает, как поместить блок try/catch где-нибудь, что, по крайней мере, позволит моему приложению выжить. Насколько я знаю, проблема заключается в фокусе, поэтому он определенно не должен убивать мое приложение (что оно и делает). Я попытался переопределить методы
ViewGroup
, но эти два методаoffset*
помечены как окончательные.
Трассировки стека:
08-17 18:23:09.825: ERROR/AndroidRuntime(1608): FATAL EXCEPTION: main
08-17 18:23:09.825: ERROR/AndroidRuntime(1608): java.lang.IllegalArgumentException: parameter must be a descendant of this view
08-17 18:23:09.825: ERROR/AndroidRuntime(1608): at android.view.ViewGroup.offsetRectBetweenParentAndChild(ViewGroup.java:2633)
08-17 18:23:09.825: ERROR/AndroidRuntime(1608): at android.view.ViewGroup.offsetDescendantRectToMyCoords(ViewGroup.java:2570)
08-17 18:23:09.825: ERROR/AndroidRuntime(1608): at android.view.ViewRoot.scrollToRectOrFocus(ViewRoot.java:1624)
08-17 18:23:09.825: ERROR/AndroidRuntime(1608): at android.view.ViewRoot.draw(ViewRoot.java:1357)
08-17 18:23:09.825: ERROR/AndroidRuntime(1608): at android.view.ViewRoot.performTraversals(ViewRoot.java:1258)
08-17 18:23:09.825: ERROR/AndroidRuntime(1608): at android.view.ViewRoot.handleMessage(ViewRoot.java:1859)
08-17 18:23:09.825: ERROR/AndroidRuntime(1608): at android.os.Handler.dispatchMessage(Handler.java:99)
08-17 18:23:09.825: ERROR/AndroidRuntime(1608): at android.os.Looper.loop(Looper.java:130)
08-17 18:23:09.825: ERROR/AndroidRuntime(1608): at android.app.ActivityThread.main(ActivityThread.java:3683)
08-17 18:23:09.825: ERROR/AndroidRuntime(1608): at java.lang.reflect.Method.invokeNative(Native Method)
08-17 18:23:09.825: ERROR/AndroidRuntime(1608): at java.lang.reflect.Method.invoke(Method.java:507)
08-17 18:23:09.825: ERROR/AndroidRuntime(1608): at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:839)
08-17 18:23:09.825: ERROR/AndroidRuntime(1608): at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:597)
08-17 18:23:09.825: ERROR/AndroidRuntime(1608): at dalvik.system.NativeStart.main(Native Method)
ListView
для этогоActivity
. Помимо случайных сбоев, почти невозможно правильно настроить поведение фокуса без установкиwindowSoftInputMode="adjustPan"
, который открывает кучу других червей. Вместо этого я просто выбрал простуюScrollView
, и это отлично сработало. - person dmon   schedule 19.08.2011ListView
сEditTexts
просто не стоит. На самом деле этот самый вопрос был для меня шоу-стоппер. - person devmiles.com   schedule 02.02.2012Yeah, I know this isn't exactly recommended
. Есть ли у кого-нибудь ссылка, подтверждающая это и дающая объяснения, почему? Огромное спасибо! - person kiruwka   schedule 31.10.2014EditText
s вListView
являетсяTextView
s, оформленный какEditText
s, который при нажатии всплывает стилизованныйDialog
сEditText
в нем. - person FunkTheMonk   schedule 30.01.2015