在Listview中的EditText上模拟用户触摸操作

时间:2013-09-18 04:47:23

标签: android android-listview android-edittext android-softkeyboard

我有一个ListView,在每个listview项目中都有一个不可见的EditText和一个可点击的TextView。我正在尝试实现一种行为,点击TextView将使EditText可见,专注于EditText并使软键盘自动出现。

我正在使用adjustResize作为我的输入法而不是adjustPan,因为显然我在测试该功能的S3是adjustPan的疯狂者。 (具体来说,当软键盘出现时,整个视图会被推高,这很好。但是,一旦我开始输入,整个视图就会向下滑动,好像软键盘不在那里!但它确实是!HTC不会出现问题一)。列表视图也有afterDecendents

当列表视图中有更多可以完全适合屏幕的项目时,触发的软键盘无法响应editText会出现问题。

我用imm.showSoftInput(holder.editText,0)以编程方式触发软键盘,整个视图重新调整以适应软键盘。显示软键盘并且视图完成其重新布局后,edittext不会接收除退格之外的所有键条目。这意味着我不能在edittext中添加任何单词或数字,但我可以删除它们,这很奇怪。

另一个有趣的事情是,我意识到如果我不以编程方式显示软键盘并让用户点击可见的edittext来显示软键盘,那么一切正常。 (这也让我感到困惑,因为我怀疑listview回收和聚焦机制是造成所有这些问题的原因。软键盘出现的地方导致listview重新出现因此回收了视图因此对editText的引用丢失等。)

所以,最终,我的问题是,有没有办法让我可靠地以编程方式模拟用户点击可见的编辑文本,以便我可以触发一个与“点击”的编辑文本一起正常工作的软键盘?

我也尝试了以下方法并且它不能可靠地工作(有时它可以工作,有时它不会。使用延迟持续时间不会做任何事情。)。

holder.editText.postDelayed(new Runnable(){
    @Override
    public void run() {
         holder.editText.requestFocus();
         holder.editText.dispatchTouchEvent(MotionEvent.obtain(SystemClock.uptimeMillis(), SystemClock.uptimeMillis(), MotionEvent.ACTION_DOWN , 0, 0, 0));
         holder.editText.dispatchTouchEvent(MotionEvent.obtain(SystemClock.uptimeMillis(), SystemClock.uptimeMillis(), MotionEvent.ACTION_UP , 0, 0, 0));
         }
}}, 500);

我从许多SO问题中尝试的答案的其他排列也没有真正可靠地工作。 示例问题: How to show soft-keyboard when edittext is focusedHow come the Android soft keyboard is not responding to EditText?Android: Dialog box show soft keyboard automatically when focus is on an EditText not working

1 个答案:

答案 0 :(得分:-2)

问我有没有办法可靠地以编程方式模拟用户点击可见的编辑文本

这样我就能触发一个与“点击”的edittext一起正常工作的软键盘?

是,

如果要模拟点击 EditText

,请添加此项
          editText.performClick();    //softkeyboard will open
          editText.setPressed(true);  // edittext will get highlighted
          editText.invalidate();        //Invalidate the whole view

完成!!