尝试在
ListView
中创建带有
EditTexts
的接口并不可取,因为当你拥有足够的项目需要滚动
ListView
时,焦点会跳来跳去,你需要保存
EditText
的状态等等。通常的想法是,在
ListView
中使用
EditText
是不值得的。
经过一番研究,我可以提供以下方法:
我继承了
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 Actionbar Tabs and Keyboard Focus