【问题标题】:Simulating User Touch Action on EditText in Listview在 Listview 中模拟 EditText 上的用户触摸操作
【发布时间】:2013-09-18 04:47:23
【问题描述】:

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

我使用adjustResize 作为我的输入法而不是adjustPan,因为显然我正在测试该功能的S3 与adjustPan 发生了冲突。 (具体来说,当软键盘出现时,整个视图被推上去,这很好。但是,一旦我开始打字,整个视图就会滑回,好像软键盘不在那里一样!但它是!HTC不会出现问题一)。列表视图也有afterDecendents

当列表视图有更多可以完全适应屏幕的项目时,会出现一个问题,即触发的软键盘对editText没有响应。

我使用imm.showSoftInput(holder.editText,0) 以编程方式触发软键盘,整个视图重新调整自身以适应软键盘。一旦显示了软键盘并且视图完成了重新布局,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 focused , How 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

【问题讨论】:

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


    【解决方案1】:

    Q 有什么方法可以让我可靠地以编程方式模拟用户点击可见的编辑文本

    这样我就可以触发与“点击”编辑文本一起正常工作的软键盘?

    是的,

    当你想模拟你对 EditText

    的点击时添加这个
              editText.performClick();    //softkeyboard will open
              editText.setPressed(true);  // edittext will get highlighted
              editText.invalidate();        //Invalidate the whole view
    

    完成!!

    【讨论】:

    • 我之前试过performClick(),但它没有显示软键盘。当 editText 可见性从不可见变为可见时,列表视图无效。我会试试你的代码序列。希望setPressed(true) 能解决问题。 :D
    • 好的,刚刚测试过了。不幸的是,它不会导致软键盘出现。 :( 我什至注册了一个点击事件监听器。performClick() 确实触发了一个点击事件,但它不会导致软键盘出现。我什至查看了 android 4.0 EditText(TextView) 源代码,看看是什么触发了软键盘,看起来仅在onKeyUp()onTouchEvent() 和用户触发横向旋转的三个地方触发。
    • @Tikiboy 一次调用所有 3 个方法并尝试(执行单击、设置和无效)
    • 我确实一次给他们三个都打了电话。它没有用。 :( 如果这只是嵌套在单个根视图中的标准编辑文本,它可能会起作用(没有测试它所以不确定)。但在这个场景中,它是一个列表视图项中的编辑文本。;/
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-10-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多