在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的InputMethodManager
和View
链接。 它将在View
引用getWindowToken
在InputMethodManager
引用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" />