禁用 EditText 上的键盘

我在做计算器。 So I made my own Buttons with numbers and functions. 必须计算的表达式在 EditText中,因为我希望用户也可以在表达式的中间添加数字或函数,所以在 EditText中我有 cursor。但我想禁用的 Keyboard时,用户点击的 EditText。 我发现这个例子,这是确定的 Android 2.3,但与 ICS禁用的 Keyboard和光标。

public class NoImeEditText extends EditText {


public NoImeEditText(Context context, AttributeSet attrs) {
super(context, attrs);
}


@Override
public boolean onCheckIsTextEditor() {
return false;
}
}

然后在我的 XML文件中使用这个 NoImeEditText

<com.my.package.NoImeEditText
android:id="@+id/etMy"
....
/>

How I can make compatible this EditText with ICS??? 谢谢。

123715 次浏览

这里 是一个网站,将给你你所需要的

作为一个总结,它提供了来自 Android 开发人员的到 InputMethodManagerView的链接。它将参考 ViewhideSoftInputFromWindow()内部的 getWindowToken作为 InputMethodManager

在链接中给出了一个更好的答案,希望这有所帮助。

here is an example to consume the onTouch event:

editText_input_field.setOnTouchListener(otl);


private OnTouchListener otl = new OnTouchListener() {
public boolean onTouch (View v, MotionEvent event) {
return true; // the listener has consumed the event
}
};

这是同一个网站上的另一个例子。这声称工作,但似乎是一个坏主意,因为你的 EditBox 是 NULL 它将不再是一个编辑器:

MyEditor.setOnTouchListener(new OnTouchListener(){


@Override
public boolean onTouch(View v, MotionEvent event) {
int inType = MyEditor.getInputType(); // backup the input type
MyEditor.setInputType(InputType.TYPE_NULL); // disable soft input
MyEditor.onTouchEvent(event); // call native handler
MyEditor.setInputType(inType); // restore input type
return true; // consume touch even
}
});

希望这能为你指明正确的方向

Just set:

 NoImeEditText.setInputType(0);

或者在构造函数中:

   public NoImeEditText(Context context, AttributeSet attrs) {
super(context, attrs);
setInputType(0);
}

尝试: android:editable="false"android:inputType="none"

// only if you completely want to disable keyboard for
// that particular edit text
your_edit_text = (EditText) findViewById(R.id.editText_1);
your_edit_text.setInputType(InputType.TYPE_NULL);

增加到 Alex Kucherenko 解决方案: 在调用 setInputType(0)之后光标消失的问题是由于 ICS (和 JB)上的框架错误造成的。

这里记录了这个 bug: https://code.google.com/p/android/issues/detail?id=27609

To workaround this, call setRawInputType(InputType.TYPE_CLASS_TEXT) right after the setInputType call.

要阻止键盘出现,只需覆盖 EditText 的 OnTouchListener并返回 true (吞噬触摸事件) :

ed.setOnTouchListener(new OnTouchListener() {


@Override
public boolean onTouch(View v, MotionEvent event) {


return true;
}
});

光标出现在 GB 设备而不是 ICS + 上的原因让我抓狂了几个小时,所以我希望这节省了某人的时间。

下面的代码是 API > = 11和 API < 11。游标仍然可用。

/**
* Disable soft keyboard from appearing, use in conjunction with android:windowSoftInputMode="stateAlwaysHidden|adjustNothing"
* @param editText
*/
public static void disableSoftInputFromAppearing(EditText editText) {
if (Build.VERSION.SDK_INT >= 11) {
editText.setRawInputType(InputType.TYPE_CLASS_TEXT);
editText.setTextIsSelectable(true);
} else {
editText.setRawInputType(InputType.TYPE_NULL);
editText.setFocusable(true);
}
}

你也可以直接在 API 21 + 上使用 SetShowSoftInputOnFocus (boolean),或者通过对 API 14 + 的反思来使用:

if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) {
editText.setShowSoftInputOnFocus(false);
} else {
try {
final Method method = EditText.class.getMethod(
"setShowSoftInputOnFocus"
, new Class[]{boolean.class});
method.setAccessible(true);
method.invoke(editText, false);
} catch (Exception e) {
// ignore
}
}

I found this solution which works for me. It also places the cursor, when clicked on EditText at the correct position.

EditText editText = (EditText)findViewById(R.id.edit_mine);
// set OnTouchListener to consume the touch event
editText.setOnTouchListener(new OnTouchListener() {


@Override
public boolean onTouch(View v, MotionEvent event) {
v.onTouchEvent(event);   // handle the event first
InputMethodManager imm = (InputMethodManager)v.getContext().getSystemService(Context.INPUT_METHOD_SERVICE);
if (imm != null) {
imm.hideSoftInputFromWindow(v.getWindowToken(), 0);  // hide the soft keyboard
}
return true;
}
});

禁用键盘(API 11到当前)

这是迄今为止我找到的最好的解决方案,可以禁用键盘(我见过很多这样的方案)。

if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) { // API 21
editText.setShowSoftInputOnFocus(false);
} else { // API 11-20
editText.setTextIsSelectable(true);
}

不需要使用反射或将 InputType设置为 null。

重新启用键盘

下面是如何重新启用键盘,如果需要的话。

if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) { // API 21
editText.setShowSoftInputOnFocus(true);
} else { // API 11-20
editText.setTextIsSelectable(false);
editText.setFocusable(true);
editText.setFocusableInTouchMode(true);
editText.setClickable(true);
editText.setLongClickable(true);
editText.setMovementMethod(ArrowKeyMovementMethod.getInstance());
editText.setText(editText.getText(), TextView.BufferType.SPANNABLE);
}

为什么需要复杂的 pre API 21版本来撤消 setTextIsSelectable(true),请参阅下面的问与答:

这个答案需要更彻底的检验。

我已经在更高的 API 设备上测试了 setShowSoftInputOnFocus,但是在@android 开发者下面的评论之后,我发现这需要更彻底的测试。

下面是一些可以帮助测试这个答案的剪切粘贴代码。如果您能确认它是否适用于 API 11到20,请留下评论。我没有任何 API 11-20设备,我的模拟器有问题。

Activity _ main. xml

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout
xmlns:android="http://schemas.android.com/apk/res/android"
android:id="@+id/activity_main"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:paddingBottom="@dimen/activity_vertical_margin"
android:paddingLeft="@dimen/activity_horizontal_margin"
android:paddingRight="@dimen/activity_horizontal_margin"
android:paddingTop="@dimen/activity_vertical_margin"
android:orientation="vertical"
android:background="@android:color/white">


<EditText
android:id="@+id/editText"
android:textColor="@android:color/black"
android:layout_width="match_parent"
android:layout_height="wrap_content"/>


<Button
android:text="enable keyboard"
android:onClick="enableButtonClick"
android:layout_width="wrap_content"
android:layout_height="wrap_content"/>


<Button
android:text="disable keyboard"
android:onClick="disableButtonClick"
android:layout_width="wrap_content"
android:layout_height="wrap_content"/>
</LinearLayout>

MainActivity.java

public class MainActivity extends AppCompatActivity {


EditText editText;


@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);


editText = (EditText) findViewById(R.id.editText);
}


// when keyboard is hidden it should appear when editText is clicked
public void enableButtonClick(View view) {
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) { // API 21
editText.setShowSoftInputOnFocus(true);
} else { // API 11-20
editText.setTextIsSelectable(false);
editText.setFocusable(true);
editText.setFocusableInTouchMode(true);
editText.setClickable(true);
editText.setLongClickable(true);
editText.setMovementMethod(ArrowKeyMovementMethod.getInstance());
editText.setText(editText.getText(), TextView.BufferType.SPANNABLE);
}
}


// when keyboard is hidden it shouldn't respond when editText is clicked
public void disableButtonClick(View view) {
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) { // API 21
editText.setShowSoftInputOnFocus(false);
} else { // API 11-20
editText.setTextIsSelectable(true);
}
}
}

在 StackOverflow 上从多个地方收集解决方案,我认为下一篇文章总结了这一点:

如果你不需要键盘显示在你的活动中的任何地方,你可以简单的使用下一个用于对话框的标志(从 这里获得) :

    getWindow().setFlags(WindowManager.LayoutParams.FLAG_ALT_FOCUSABLE_IM, WindowManager.LayoutParams.FLAG_ALT_FOCUSABLE_IM);

如果您不希望它只用于特定的 EditText,可以使用以下内容(从 给你获得) :

public static boolean disableKeyboardForEditText(@NonNull EditText editText) {
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) {
editText.setShowSoftInputOnFocus(false);
return true;
}
if (Build.VERSION.SDK_INT > Build.VERSION_CODES.ICE_CREAM_SANDWICH_MR1)
try {
final Method method = EditText.class.getMethod("setShowSoftInputOnFocus", new Class[]{boolean.class});
method.setAccessible(true);
method.invoke(editText, false);
return true;
} catch (Exception ignored) {
}
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.HONEYCOMB_MR2)
try {
Method method = TextView.class.getMethod("setSoftInputShownOnFocus", boolean.class);
method.setAccessible(true);
method.invoke(editText, false);
return true;
} catch (Exception ignored) {
}
return false;
}

或者这样(取自 这里) :

 if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP)
editText.setShowSoftInputOnFocus(false);
else
editText.setTextIsSelectable(true);

这招对我很管用。 首先将这个 android:windowSoftInputMode="stateHidden"添加到您的 android 清单文件中,在您的活动。如下:

<activity ... android:windowSoftInputMode="stateHidden">

然后在 onCreate 方法上添加以下代码:

EditText editText = (EditText)findViewById(R.id.edit_text);
edit_text.setOnTouchListener(new OnTouchListener() {


@Override
public boolean onTouch(View v, MotionEvent event) {
v.onTouchEvent(event);
InputMethodManager inputMethod = (InputMethodManager)v.getContext().getSystemService(Context.INPUT_METHOD_SERVICE);
if (inputMethod!= null) {
inputMethod.hideSoftInputFromWindow(v.getWindowToken(), 0);
}
return true;
}
});

然后,如果您希望指针是可见的,请将此添加到您的 xml android:textIsSelectable="true"

这将使指针可见。 这样,当您的活动开始时,键盘将不会弹出,当您点击编辑文本时,键盘也将被隐藏。

在布局文件中向 Edittext 控制器添加以下属性

<Edittext
android:focusableInTouchMode="true"
android:cursorVisible="false"
android:focusable="false"  />

我已经使用这个解决方案有一段时间了,它对我很有效。

只要把这一行放在清单中的活动标记中 android:windowSoftInputMode="stateHidden"

editText.setShowSoftInputOnFocus(false);

我不知道这个答案是否更好,但我找到了一个可能更快的解决方案。对于 XML,只需在 EditText 上输入以下属性:

android:focusable="true"
android:focusableInTouchMode="false"

And then do what you need with onClickListener.

In my case, these lines work for me...

                    android:inputType="none"
android:focusableInTouchMode="true"
android:cursorVisible="false"
android:focusable="false"

before adding these lines, When I clicked on editText default keyboard showed/invoked. enter image description here

添加这些行后,键盘不显示。

enter image description here

禁用 EditText 上的键盘的一种方法是

binding.InputTextView.showSoftInputOnFocus = false

For Edit Text use the attribute android:focusable="false"