禁用EditText闪烁光标

有人知道如何禁用EditText视图中的闪烁光标吗?

144992 次浏览

可以使用xml属性android:cursorVisible="false",也可以通过编程方式使用:

  • java: view.setCursorVisible(false)
  • 芬兰湾的科特林:view.isCursorVisible = false

完美的解决方案,更进一步的目标

目标:当EditText不在焦点时禁用闪烁光标,当EditText在焦点时启用闪烁光标。下面也会在点击EditText时打开键盘,并在键盘上按done时隐藏它。

1)在你的xml中EditText下设置:

android:cursorVisible="false"

2)设置onClickListener:

iEditText.setOnClickListener(editTextClickListener);


OnClickListener editTextClickListener = new OnClickListener()


{


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


}
};

3)然后onCreate,捕获事件时完成按下使用OnEditorActionListener到你的EditText,然后setCursorVisible(false)

//onCreate...


iEditText.setOnEditorActionListener(new OnEditorActionListener() {


@Override
public boolean onEditorAction(TextView v, int actionId,
KeyEvent event) {
iEditText.setCursorVisible(false);
if (event != null&& (event.getKeyCode() == KeyEvent.KEYCODE_ENTER)) {
InputMethodManager in = (InputMethodManager) getSystemService(Context.INPUT_METHOD_SERVICE);
in.hideSoftInputFromWindow(iEditText.getApplicationWindowToken(),InputMethodManager.HIDE_NOT_ALWAYS);
}
return false;
}
});

在我的例子中,我想在编辑聚焦时启用/禁用游标。

在活动中:

@Override
public boolean dispatchTouchEvent(MotionEvent ev) {
if (ev.getAction() == MotionEvent.ACTION_DOWN) {
View v = getCurrentFocus();
if (v instanceof EditText) {
EditText edit = ((EditText) v);
Rect outR = new Rect();
edit.getGlobalVisibleRect(outR);
Boolean isKeyboardOpen = !outR.contains((int)ev.getRawX(), (int)ev.getRawY());
System.out.print("Is Keyboard? " + isKeyboardOpen);
if (isKeyboardOpen) {
System.out.print("Entro al IF");
edit.clearFocus();
InputMethodManager imm = (InputMethodManager) this.getSystemService(Context.INPUT_METHOD_SERVICE);
imm.hideSoftInputFromWindow(edit.getWindowToken(), 0);
}


edit.setCursorVisible(!isKeyboardOpen);


}
}
return super.dispatchTouchEvent(ev);
}

您可以使用以下代码以编程方式启用和禁用编辑文本游标。

启用游标

    editText.requestFocus();
editText.setCursorVisible(true);

禁用游标

    editText.setCursorVisible(false);

使用XML启用禁用游标

   android:cursorVisible="false/true"
android:focusable="false/true"

使edit_text可选(复制/剪切/粘贴/选择/全选)

   editText.setTextIsSelectable(true);

要专注于触摸模式,请在XML中编写以下代码行

  android:focusableInTouchMode="true"
android:clickable="true"
android:focusable="true"

以编程方式

  editText.requestFocusFromTouch();

清除触摸模式的焦点

  editText.clearFocus()

如果你想忽略活动开始时的Edittextandroid:focusableandroid:focusableInTouchMode会帮助你。

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:id="@+id/linearLayout7" android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:focusable="true" android:focusableInTouchMode="true">

这个LinearLayout和你的Edittext

  1. 改变焦点到另一个视图(例如:任何textview或XML中的线性布局)使用

    android:focusableInTouchMode="true"
    android:focusable="true"
    
  2. set addTextChangedListener to edittext in Activity.

  3. and then on aftertextchanged of Edittext put edittext.clearFocus();

This will enable the cursor when keyboard is open and disable when keyboard is closed.

简单地添加这一行到你的父布局

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical"
android:focusable="true"
android:focusableInTouchMode="true">


<EditText
android:inputType="text"
android:layout_width="wrap_content"
android:layout_height="wrap_content" />


</LinearLayout>

将游标可见性设置为true和false的问题可能是一个问题,因为它会删除游标,直到您再次设置它,同时字段是可编辑的,这不是很好的用户体验。

所以不用

setCursorVisible(false)

就像这样做

        editText2.setFocusableInTouchMode(false)
editText2.clearFocus()
editText2.setFocusableInTouchMode(true)

上面的代码删除焦点,进而删除游标。并再次启用它,这样你就可以再次触摸它并编辑它。就像普通的用户体验一样。

在kotlin中your_edittext。isCursorVisible = false

.clearFocus rootLayout.findFocus () ();

添加android: focusableInTouchMode =“true"在根布局中,当编辑文本将被单击时,光标将被显示。