当焦点不在EditText上时,在EditText中显示光标

nit*_*agi 20 android android-edittext

网格状布局的图像

我正在开发Android智能电视应用程序:

  • 在一个view有自定义键盘和EditText.

  • 应用程序启动时焦点转到键盘.

    期望:

    • 当用户键入键盘(用遥控器点击)时,光标也应该在键盘内闪烁editText.

我该如何在里面展示这种效果EditText

Ovi*_*diu 8

你可以尝试这样的事情:

editText.setText(text);
editText.setPressed(true);
editText.setSelection(editText.getText().length()); // moves the cursor to the end of the text
Run Code Online (Sandbox Code Playgroud)

然而,这种方法有两个问题:

  1. 光标不会闪烁。闪烁的逻辑位于 Editor 类中,无法覆盖。它要求 EditText 获得焦点,并且窗口内只能同时获得 1 个视图 - 在您的情况下,这将是键盘按钮之一。

    /**
     * @return True when the TextView isFocused and has a valid zero-length selection (cursor).
     */
    private boolean shouldBlink() {
        if (!isCursorVisible() || !mTextView.isFocused()) return false;
        ...
    }
    
    Run Code Online (Sandbox Code Playgroud)
  2. 光标并不总是可见。光标的闪烁取决于系统时间 - 它在半秒内可见,并在接下来的半秒内隐藏。仅当在根据系统时间光标可见的时间点调用我上面建议的代码时,光标才会可见。

这就是本机键盘/IME 如此工作的原因。它是一个单独的窗口,当用户点击不同窗口(键盘/IME)中的视图时,它允许 EditText 保持焦点并具有闪烁光标功能。

话虽这么说,上面的问题有一个解决方法 - 当你不再需要它时,请确保将 shouldBlink 设置为 false,否则肯定会发生内存泄漏或崩溃:

private void blink() {
    if (shouldBlink) {
        editText.setText(editText.getText());
        editText.setPressed(true);
        editText.setSelection(editText.getText().length());

        new Handler().postDelayed(new Runnable() {
            @Override
            public void run() {
                if (shouldBlink) {
                    blink();
                }
            }
        }, 500);
    }
}
Run Code Online (Sandbox Code Playgroud)


Int*_*iya 6

如果您为该字段设置背景,则会发生这种情况。如果要解决此问题,请将设置cursorDrawable@null

您应该添加textCursorDrawable使用cursorVisible

引用将在插入光标下绘制的可绘制对象。

android:cursorVisible="true"
android:textCursorDrawable="@null"
Run Code Online (Sandbox Code Playgroud)


小智 6

只需添加

editText.requestFocus();


Kes*_*234 5

在您的布局 xml 文件中,在您的编辑文本中添加以下行:

<requestFocus/>
Run Code Online (Sandbox Code Playgroud)

这会将光标置于您的 editText 小部件中。

希望能帮助到你。


DJp*_*phy 5

你可以这样做.我希望/我认为你有一个你已经创建的按钮的布局,你可以为这个布局设置一个焦点监听器,在onFocusChange方法中你可以检查是否(layout.hasFocus())和做这个...

例如,如果你的edittext被命名为et,你可以将其设置为:

et.setActivated(true);
et.setPressed(true);
Run Code Online (Sandbox Code Playgroud)

我有一个小例子代码,你有两个编辑文本

 et2.setOnFocusChangeListener(new OnFocusChangeListener() {

        @Override
        public void onFocusChange(View v, boolean hasFocus) {

            if(et2.hasFocus()){

                //et1.setCursorVisible(true);
                et1.setActivated(true);
                et1.setPressed(true);

            }
        }
    });
Run Code Online (Sandbox Code Playgroud)

希望这可以帮助...