После неудачной попытки создать интерфейс с EditTexts
внутри ListView
все, что я могу вам сказать, это «Не надо!». У вас будет гораздо больше проблем, когда у вас будет достаточно предметов для прокрутки вашего ListView
, фокус будет переключаться тут и там, вам придется сохранять состояние EditText
и так далее. Похоже, что общая идея заключается в том, что использование EditText
в ListView
не стоит.
После долгих исследований я могу предложить следующий метод, который мне помог:
Я унаследовал ListView
и переопределил метод layoutChildren, внутри него я делаю следующее:
@Override
protected void layoutChildren() {
super.layoutChildren();
final EditText tv = (EditText)this.getTag();
if (tv != null)
{
Log.d("RUN", "posting delayed");
this.post(new Runnable() {
@Override
public void run() {
Log.d("RUN", "requesting focus in runnable");
tv.requestFocusFromTouch();
tv.dispatchTouchEvent(MotionEvent.obtain(SystemClock.uptimeMillis(), SystemClock.uptimeMillis(), MotionEvent.ACTION_DOWN , tv.getWidth(), tv.getHeight(), 0));
tv.dispatchTouchEvent(MotionEvent.obtain(SystemClock.uptimeMillis(), SystemClock.uptimeMillis(), MotionEvent.ACTION_UP , tv.getWidth(), tv.getHeight(), 0));
}
});
}
}
Когда я знаю, какой EditText
должен получить фокус (я знаю это при вызове getView моих адаптеров), я устанавливаю этот конкретный EditText
в качестве тега на ListView
. Затем ListView выкладывается сам, и моя ветка сообщений ставится в очередь. Он запускается и запрашивает фокусировку, однако, поскольку в моем случае этого было недостаточно, я также генерирую два MotionEvents
, которые просто имитируют касание. Очевидно, этого достаточно, чтобы появилась программная клавиатура.
Причины этого объясняются в ответе здесь:
Вкладки панели действий Android и фокус клавиатуры