浓缩咖啡为EditText设置光标

3

我正在尝试使用Espresso测试一个已经包含一些文本的EditText。问题在于,当我使用typeText()时,光标会被放置在文本中的任意位置。我尝试在使用typeTextIntoFocusedView之前执行click(),但是光标有时会被放置在EditText的开头。我想知道是否可能在输入文本之前将光标设置在EditText的末尾?

4个回答

3
更好的方式是按照 Espresso 的设计使用它:通过对视图匹配器执行操作。
Kotlin 示例:
class SetEditTextSelectionAction(private val selection: Int) : ViewAction {

    override fun getConstraints(): Matcher<View> {
        return allOf(isDisplayed(), isAssignableFrom(EditText::class.java))
    }

    override fun getDescription(): String {
        return "set selection to $selection"
    }

    override fun perform(uiController: UiController, view: View) {
        (view as EditText).setSelection(selection)
    }
}

使用示例:

onView(withId(R.id.my_text_view).perform(SetEditTextSelectionAction(selection))
< p > 与手动执行 findViewById() 相比,另一个额外的优势是您可以将其与匹配器(如 withSubString("my text"))相结合,如果您没有视图的ID。< /p > < p > 顺便说一下:要将其更改为在文本末尾设置选择,只需删除 selection: Int 构造函数参数并将 setSelection(selection) 更改为 setSelection(view.text.lastIndex)。 < /p >

这应该是正确的答案,因为它遵循了Espresso指南。 - Jokubas Trinkunas

1
我找到的唯一方法是获取对EditText本身的引用,然后使用EditText#setSelection()。例如,将光标移动到当前文本的末尾:
    val activity = activityRule.activity
    val tv = activity.findViewById<EditText>(R.id.edittext)
    activity.runOnUiThread { tv.setSelection(tv.text.length) } 

.runOnUiThread{}很糟糕。 (Espresso也是如此-尽可能使用@UiThreadTest运行测试用例。)但是,如果您必须在与UI不同的线程中运行测试用例,请使用InstrumentationRegistry.getInstrumentation().runOnMainSync{},以便您阻塞直到UI事件完成并且您的用例可以安全地恢复。 - Phlip

0

我想把我的答案发出来,因为我刚遇到了这个问题,其他答案都无法解决我的问题。

我使用了GeneralClickAction在编辑文本的右侧点击,将光标放置在EditText的末尾位置。之后,我使用TypeTextAction并通过构造函数传入false来禁用了tapToFocus行为:

onView(withId(R.id.edit_text))
.perform(
  new GeneralClickAction(Tap.SINGLE, GeneralLocation.CENTER_RIGHT, Press.FINGER, 0, 0, null),
  new TypeTextAction(text, false)
);

0

我通过插入“Home”和“End”的KeyCode成功了。它们的功能就像您桌面键盘上的一样,可以将光标移动到EditText的开头或结尾。例如:

onView(withId(R.id.myView))
    .perform(pressKey(KeyEvent.KEYCODE_MOVE_HOME))

要移动到末尾,您可以使用KeyEvent.KEYCODE_MOVE_END,并且您可以使用KeyEvent.KEYCODE_DPAD_LEFTKeyEvent.KEYCODE_DPAD_RIGHT向左或向右移动。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接