在EditText上禁用键盘

我正在做一个计算器。 所以我用数字和function做了我自己的Buttons 。 必须计算的expression式是在EditText ,因为我希望用户可以在expression式的中间添加数字或函数,所以使用EditText我有cursor 。 但是我想在用户点击EditText时禁用Keyboard 。 我发现这个例子,它适用于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" .... /> 

我怎样才能使这个EditText与ICS兼容? 谢谢。

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

作为总结,它提供了Android Developers的InputMethodManagerView链接。 它将在View引用getWindowTokenInputMethodManager引用hideSoftInputFromWindow()

链接中给出了更好的答案,希望这有助于。

这里是一个消费onTouch事件的例子:

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

希望这个指向你正确的方向

以下代码适用于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); } } 

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

您也可以直接在API 21+上使用setShowSoftInputOnFocus(boolean) ,或者通过API 14+上的reflection:

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

刚刚设置:

  NoImeEditText.setInputType(0); 

或者在构造函数中:

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

我发现这个解决scheme适合我。 它也放置光标,当点击EditText在正确的位置。

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

没有必要使用reflection或将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); } 

查看这个Q&A为什么需要复杂的前期API 21版本来撤销setTextIsSelectable(true)

  • 如何使用setTextIsSelectable禁用键盘后启用键盘

这个答案需要更彻底的testing。

我已经在更高的API设备上testing了setShowSoftInputOnFocus ,但是在下面的@ androiddeveloper的评论之后,我看到这需要更彻底的testing。

这里有一些剪切和粘贴代码来帮助testing这个答案。 如果您可以确认它是否适用于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); } } } 

要添加到Alex Kucherenko解决scheme:在调用setInputType(0)后游标正在消失的问题是由于ICS(和JB)上的框架错误。

该错误logging在这里: https : //code.google.com/p/android/issues/detail?id=27609 。

要解决这个问题,请在setInputType调用之后setRawInputType(InputType.TYPE_CLASS_TEXT)调用setRawInputType(InputType.TYPE_CLASS_TEXT)

要停止显示键盘,只需重写EditText的OnTouchListener并返回true(吞咽触摸事件):

 ed.setOnTouchListener(new OnTouchListener() { @Override public boolean onTouch(View v, MotionEvent event) { return true; } }); 

光标出现在GB设备而不是ICS +上的原因让我把头发撕了几个小时,所以我希望这样可以节省一些时间。

从StackOverflow的多个地方收集解决scheme,我认为下一个总结:

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

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

只是做简单的事情,让.. EditText启用false.whenever需要再次make是启用真正的编程或反之亦然。

  <EditText android:enabled="false" android:id="@+id/et_events_search" android:layout_width="match_parent" android:layout_height="wrap_content" android:ems="10" />