禁用EditText的输入法但保持光标闪烁

4
在我的Android应用程序中,我想要一个具有android:editable="false"但光标闪烁的EditText。当"editable"设置为false时,光标闪烁似乎不起作用。
我只想使用自己的键盘小部件(而不是系统软键盘),并保持光标闪烁。
有什么办法可以实现这一点吗?

我最初发布了一个答案,使用android:inputType="none"。然而,现在我想到了这一点,我不认为这是可能的。开发人员让这样的事情成为可能并没有太多意义。我建议您创建一个自定义的TextView类,并使用自己的触摸监听器。 - Cat
你有没有通过为EditText设置TextWatcher来解决这个问题的方法? - ρяσѕρєя K
谢谢@Eric, 我查阅了TextView.shouldBlink() & TextView.onDraw(4.0.3)的源代码,光标闪烁的条件是"mMovement != null && (isFocused() || isPressed())"和isCursorVisible(),这是否真的需要制作自定义TextView呢?或者我们有更简单的方法吗? - heihei
我真的不确定有什么简单的方法。从谷歌的角度来看,如果用户无法通过键盘进行交互,那么光标闪烁就没有任何意义。我只在游戏Spirit中看到过这样的自定义键盘,它使用了某种自定义的EditText。 - Cat
4个回答

4
也许尝试完全省略xml属性android:editable,然后尝试以下组合来使光标闪烁且防止触摸事件弹出本地IME(键盘)。
/*customized edittext class 
* for being typed in by private-to-your-app custom keyboard.
* borrowed from poster at https://dev59.com/21HTa4cB1Zd3GeqPULxh
*/
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;
}

第四步 在该类实例被实例化和调用为viewB的另一个位置,我添加了一个新的触摸事件处理程序。

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

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

<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。在我的情况下,“步骤5”不是必需的。 - Lym Zoy

0
我在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);
}

0

为了帮助寻找答案的人,我在这里添加了这个方法。我尝试了很多方法,但只有这一个对我有效。

 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);
    }
}

0

您可以使用以下两种方式之一:

android:cursorVisible="false"

或者使用以下 Java 函数:

setCursorVisible(false)。

这两种方式都可以达到同样的效果。


他希望光标可见。此外,如果它无法获得焦点,我认为这段代码不起作用。 - Cat

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