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

时间:2015-05-20 09:06:34

标签: android android-edittext

Image of a grid-like layout

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

  • view中,有一个自定义键盘和一个EditText

  • 当应用程序启动时,焦点会转到键盘上。

    所需

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

如何在EditText

中显示此效果

11 个答案:

答案 0 :(得分:5)

你可以这样做。我希望/我认为你有一个你已经创建的按钮的布局,你可以为这个布局设置一个焦点监听器,并且在onFocusChange方法中你可以检查 if(layout.hasFocus())并执行此操作...

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

et.setActivated(true);
et.setPressed(true);

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

 et2.setOnFocusChangeListener(new OnFocusChangeListener() {

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

            if(et2.hasFocus()){

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

            }
        }
    });

希望这会有所帮助......

答案 1 :(得分:4)

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

您应该使用textCursorDrawable添加cursorVisible

  

引用将在插入光标下绘制的drawable。

android:cursorVisible="true"
android:textCursorDrawable="@null"

答案 2 :(得分:2)

有几种方法可以做到:

1)XML

android:cursorVisible="true"

2)Java

mEditText.setOnClickListener(editTextClickListener);
OnClickListener editTextClickListener = new OnClickListener() {

    public void onClick(View v) {
        if (v.getId() == mEditText.getId()) {
            mEditText.setCursorVisible(true);
        }
    }
};

or

if (mEditText.hasFocus()){
    mEditText.setCursorVisible(true);
}

答案 3 :(得分:1)

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

<requestFocus/>

这会将光标放在editText小部件中。

希望它有所帮助。

答案 4 :(得分:1)

您可以在“活动”中使用以下代码:

//Get the EditText using
EditText et = (EditText)findViewById(R.id.editText); 

//Set setCursorVisible to true
et.setCursorVisible(true);

答案 5 :(得分:1)

You can explicitly put caret to last position in text:
            int pos = editText.getText().length();
            editText.setSelection(pos);
  

这将始终关注edittext上的第一个字符。

             android:focusable="true"

答案 6 :(得分:1)

我知道这很坏,但这比上面的解决方案好得多。只需扩展EditText并添加:

  @Override
  public boolean isCursorVisible() {
    return true;
  }

  @Override
  public boolean isFocused() {
    return true;
  }

在您的XML中:

  <com.foo.MyEditText
    ...
    android:focusable="false"
    android:focusableInTouchMode="false"
    android:clickable="false"
    android:cursorVisible="true"/>

现在EditText认为它已聚焦并且光标可见,但实际上无法聚焦。

答案 7 :(得分:1)

    private void setFocusCursor(){
  mBinding.replyConversationsFooter.footerEditText.setFocusable(true);
  `mBinding.replyConversationsFooter.footerEditText.setFocusableInTouchMode(true);`
 `mBinding.replyConversationsFooter.footerEditText.requestFocus();` 
    }

只需在oncreateView()中调用此函数即可。 我们只能设置一个并且只能将焦点放在一个窗口上。因此,这样做可以帮助您解决问题。

答案 8 :(得分:0)

在API 27、28仿真器上进行了测试。

删除background属性,添加focusable

<EditText
    ...
    android:focusable="true"
    android:focusableInTouchMode="true"
    />

在代码中编写:edit.requestFocus();尽管下划线是可见的。

要删除下划线,请参见https://stackoverflow.com/a/52052087/2914140

edit.getBackground().mutate().setColorFilter(ContextCompat.getColor(getContext(), R.color.white), PorterDuff.Mode.SRC_ATOP);

要更改光标的颜色,请参见https://stackoverflow.com/a/49462015/2914140

添加android:textCursorDrawable="@drawable/shape_cursor",而shape_cursor是:

<?xml version="1.0" encoding="utf-8"?>
<shape xmlns:android="http://schemas.android.com/apk/res/android">
    <size
        android:width="1dp"
        android:height="25dp"
        />
    <solid android:color="@color/gray" />
</shape>

它适用于API 27、28仿真器,但在实际设备(API 21)上,光标消失了。我从这里到那里尝试了许多变体,但没有任何帮助。

然后我注意到,EditText至少包含一个符号时,它会显示光标。当没有输入任何内容时,我添加了TextWatcher来添加空格。

private lateinit var someText: String

...
edit.requestFocus()
edit.setText(" ")
edit.addTextChangedListener(YourTextWatcher())


private inner class YourTextWatcher : TextWatcher {

    override fun afterTextChanged(s: Editable?) {
        someText = s.toString().trim()
        if (someText.isEmpty()) {
            // To not fall into infinite loop.
            if (s?.length != 1) {
                edit.setText(" ")
            }
        } else {
        }
    }

    override fun beforeTextChanged(s: CharSequence?, start: Int, count: Int, after: Int) {}

    override fun onTextChanged(s: CharSequence?, start: Int, before: Int, count: Int) {}
}

如果您在EditText内部点击,也可以添加填充物。

答案 9 :(得分:0)

只需添加

editText.requestFocus();

答案 10 :(得分:0)

我确实这样:

var msgEditText = dialog.findViewById(R.id.msg1textView) as EditText

msgEditText.isActivated = true
msgEditText.isPressed = true
msgEditText.requestFocus()
msgEditText.setSelection(view.getText().length)