Android: 在所有的EditText中禁用软键盘

24

我正在为Android上的对话框工作,其中包含几个EditText。 我在onCreate()中加入了以下代码以禁用软键盘:

Keypad.this.getWindow().setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_STATE_ALWAYS_HIDDEN);

问题在于它只有在对话框出现且不做任何操作时才起作用。 当我移动到下一个EditText时,键盘出现并且不会消失。

是否有人有解决这个问题的想法?


你为什么想要这个? - Macarse
11
我有自己的按键盘,想要使用它,不想每次点击EditText时弹出软键盘。 - Yaniv
13个回答

35

如果您查看onCheckIsTextEditor()方法的实现(在TextView中),它看起来像这样:

@Override
public boolean onCheckIsTextEditor() {
    return mInputType != EditorInfo.TYPE_NULL;
}
这意味着你不需要子类化,你可以直接这样做:
((EditText) findViewById(R.id.editText1)).setInputType(InputType.TYPE_NULL); 

我尝试在布局的XML文件中设置android:inputType="none",但对我没有用,所以我最终使用编程方式实现。


当我使用它时,只有第一行文本可见:( 。并非所有数据都显示。 - newday
在一些设备上,编程设置空值无效。 - landry
3
这将防止任何与EditText的触摸交互(例如长按和选择)。这可能不是许多开发人员想要的效果... - IgorGanapolsky

26

创建一个继承 EditText 并重写 onCheckIsTextEditor() 方法的自定义类:

public class NoImeEditText extends EditText {
    public NoImeEditText(Context context, AttributeSet attrs) {
        super(context, attrs);
    }
    @Override
    public boolean onCheckIsTextEditor() {
        return false;
    }
}

它阻止了我运行findViewById()。我得到了类转换异常。 - Yaniv
1
我忘了提到,我不想禁用EditText,我有自己编写的键盘,想要使用它。 - Yaniv
您需要在xml文件中定义NoImeEditText作为自定义的EditText,然后使用NoImeEditText et=(NoImeEditText) findViewById(R.id.itsId) 进行调用。您可以处理onFocusChange事件,如果et.hasFocus()则显示您的键盘。 - jkhouw1
在布局XML中,使用完全限定的引用来引用您的自定义控件:<com.yourpackge.path.NoImeEdit android:id="@+id/custControl"... - jkhouw1
你的代码(或类名)中构造函数名称错误。应该是NoImeEditText。 - Lucas Lima
显示剩余6条评论

22

试一试这个...

edittext.setInputType(InputType.TYPE_NULL);      
if (android.os.Build.VERSION.SDK_INT >= 11)   
{  
    edittext.setRawInputType(InputType.TYPE_CLASS_TEXT);  
    edittext.setTextIsSelectable(true);  
}

1
太好了!文本仍然具有光标和可选择性,但是关于API 9怎么办? - Oleksii Malovanyi
嗨,Aleksey。谢谢!'edittext.setInputType(InputType.TYPE_NULL);' 在 API 8 中完美运行了。但是当我在 API 14 上测试时,它没有起作用。这就是为什么我添加了 If 条件的原因。 - ASP
1
谢谢,我一直在寻找一种方法,在将EditText设置为不可编辑后使其内容可选择。 - yajnesh
1
与以下组合完美运作: editText.setInputType(EditorInfo.TYPE_NULL); - IgorGanapolsky

5
调用 TextView.setShowSoftInputOnFocus(false) 方法。该方法自 API 级别 21 开始记录文档,但实际上自 API 级别 16 就已经存在(只是被隐藏在 JavaDoc 中)。我在 AlertDialog 中与 dialog.getWindow().setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_STATE_ALWAYS_HIDDEN) 结合使用 API 级别 16。

在 API 级别 14 中,有一个隐藏的方法 setSoftInputShownOnFocus(),其目的似乎相同,但我尚未测试过。

相对于 InputType.TYPE_NULL 的优点是,所有正常的输入类型都可以使用(例如用于密码输入),而且触摸事件会将光标定位到文本中的正确位置。


5

我整天都在寻找这个问题的解决方案,然后我发现了这种方法。我将它放在这里,因为它似乎完美地回答了这个问题。

EditText et = ... // your EditText
et.setKeyListener(null) //makes the EditText non-editable so, it acts like a TextView.

无需子类化。与使您的EditText不可聚焦的区别在于,EditText仍然具有自己的光标-您可以选择文本等。它所做的只是抑制IME弹出其自己的软键盘。


我想禁用EditText但仍然使setOnClickListener正常工作。在这种情况下,这很有效。 - Adil Malik

4

距离这篇文章发布已经有一段时间了,但以下方法对我非常有效:在XML文件中的EditText属性中添加 android:focusable="false"。这样即使用户点击它,键盘也不会弹出。如果您提供自己的键盘,这将非常有用。


2

可能现在已经晚了,但您是否尝试在布局中对EditText进行以下设置呢?

android:inputType="none"

更新

使用,

editText.setInputType(InputType.TYPE_NULL)
editText.setFocusable(false)

不,它不起作用。使用此属性键盘仍然会弹出。你试过它能用吗? - Yaniv
我的错。它不起作用!我正在使用一个选项卡模拟器,并启用了物理键盘。让我试验一下,然后更新或删除此评论。感谢快速回复。 - VenoM
好的,我尝试了一些方法!下面的答案有效。即手动将editText#setInputType设置为0InputType.TYPE_NULL。这种方法是否不好,因为没有人给出任何积极的建议?@Yaniv:一旦您确认已阅读我的评论,我将删除此帖子,因为它无法起作用。谢谢! - VenoM
editText.setInputType(InputType.TYPE_NULL) 结合 editText.setFocusable(false) 对我很有用 [API: 19] - VenoM
@VenoM 这太棒了!! - GreenROBO

2
将此代码放在Oncreate方法中。
getWindow().setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_STATE_ALWAYS_HIDDEN);

0
你可以这样做:
textView.setOnClickListener(null);

这将禁用textView的键盘,点击将不再起作用。


0
如果您将TextView放在ViewGroup中,可以使用以下代码使该视图在其子项之前获得焦点:
view.setDescendantFocusability(view.FOCUS_BLOCK_DESCENDANTS);

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