【问题标题】:Disable input method of EditText but keep cursor blinking禁用EditText的输入法但保持光标闪烁
【发布时间】:2020-06-23 22:08:59
【问题描述】:

在我的 Android 应用程序中,我想要一个带有 android:editable="false"EditText,但光标在闪烁。将“editable”设置为false后,光标闪烁似乎不起作用。

我只想使用我自己的键盘小部件(不是系统的软键盘),并保持光标闪烁。

有什么想法可以让这成为可能吗?

【问题讨论】:

  • 我最初使用android:inputType="none" 发布了一个答案。不过,现在想到这个,我觉得不太可能。对于开发人员来说,让这样的事情成为可能并没有多大意义。我建议您使用自己的触摸侦听器创建一个自定义 TextView 类。
  • 您有什么问题可以通过为 EditText 设置TextWatcher 来解决这个问题??
  • 谢谢@Eric,我查了TextView.shouldblink() & TextView.onDraw(4.0.3)的源码,光标闪烁的条件是"mMovement != null && (isFocused( ) || isPressed())”和isCursorVisible(),真的需要自定义TextView吗?或者我们可以有一个简单的方法?
  • 我真的不确定有什么简单的方法。从 Google 的角度来看,如果用户无法通过某些键盘进行交互,那么让光标闪烁是没有任何意义的。我唯一一次看到这样的自定义键盘是在游戏 Spirit 中,它使用了某种自定义 EditText

标签: android android-widget


【解决方案1】:

也许可以尝试完全省略xml属性android:editable,然后尝试以下组合

保持光标闪烁防止触摸事件弹出原生 IME(键盘)..

/*customized edittext class 
* for being typed in by private-to-your-app custom keyboard.
* borrowed from poster at http://stackoverflow.com/questions/4131448/android-how-to-turn-off-ime-for-an-edittext
*/
public class EditTextEx extends EditText {
    public EditTextEx(Context context, AttributeSet attrs) {
        super(context, attrs);
    }
    @Override 
    public boolean onCheckIsTextEditor() {

        return false; //for some reason False leads to cursor never blinking or being visible even if setCursorVisible(true) was called in code.
    }       
}

第 2 步 把上面的方法改成return true;

第 3 步 在上面的类中添加另一个方法。

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

第 4 步 在该类的实例已被实例化并称为 viewB 的另一个位置,我添加了一个新的触摸事件处理程序

    viewB.setOnTouchListener(new View.OnTouchListener() {
        @Override
        public boolean onTouch(View view, MotionEvent event) {
            viewB.setCursorVisible(true);
            return false;
        }
    });

第 5 步检查以确保 XML 和/或 EditText 实例化代码将 IME/键盘类型声明为“无”。我没有确认相关性,但我也在使用下面的可聚焦属性。

<questionably.maybe.too.longofa.packagename.EditTextEx
    android:id="@+id/editText1"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:ems="10"
    android:focusable="true"
    android:focusableInTouchMode="true"
    android:inputType="none">

很抱歉有这么多 xml 属性。我的代码全部使用了它们,在4.2.1 中测试,并且有结果。

希望这会有所帮助。

【讨论】:

  • 谢谢,完美运行。我在 Nexus 4 上,操作系统是 6.0.1。就我而言,Step 5 不是必需的。
【解决方案2】:

你可以使用xml属性中的任何一个

android:cursorVisible="false"

或者java函数

setCursorVisible(false).

会有用的

【讨论】:

  • 他希望光标可见。此外,如果无法获得焦点,我认为这段代码不起作用。
【解决方案3】:

只需为任何寻找和回答的人添加此方法。我尝试了很多方法,但只有这一种对我有用。

 public static void disableSoftKeyboard(final EditText v) {
    if (Build.VERSION.SDK_INT >= 11) {
        v.setRawInputType(InputType.TYPE_CLASS_TEXT);
        v.setTextIsSelectable(true);
    } else {
        v.setRawInputType(InputType.TYPE_NULL);
        v.setFocusable(true);
    }
}

【讨论】:

    【解决方案4】:

    我从 onCreate() 调用了以下内容,但这会影响所有 EditText。

    private void hideKeyboard ()
    {
        getWindow ().setSoftInputMode (WindowManager.LayoutParams.SOFT_INPUT_STATE_ALWAYS_HIDDEN);
        getWindow ().setFlags (WindowManager.LayoutParams.FLAG_ALT_FOCUSABLE_IM,
                               WindowManager.LayoutParams.FLAG_ALT_FOCUSABLE_IM);
    }
    

    【讨论】:

      猜你喜欢
      • 2011-07-31
      • 1970-01-01
      • 2017-07-17
      • 2011-10-30
      • 2022-10-20
      • 2015-04-28
      • 2017-01-23
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多