我正在做一个计算器。
所以我用数字和函数创建了自己的Buttons
。
必须计算的表达式是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;
}
}
然后我在NoImeEditText
文件中使用此XML
<com.my.package.NoImeEditText
android:id="@+id/etMy"
....
/>
如何使这个EditText与ICS兼容??? 感谢。
答案 0 :(得分:60)
以下代码适用于API&gt; = 11和API&lt; 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);
}
}
答案 1 :(得分:42)
Here是一个可以满足您需求的网站
总结一下,它提供了来自Android开发者的InputMethodManager
和View
的链接。它将引用getWindowToken
内的View
和hideSoftInputFromWindow()
的{{1}}
链接中给出了更好的答案,希望这会有所帮助。
这是一个使用onTouch事件的示例:
InputMethodManager
这是同一网站的另一个例子。这声称工作,但似乎是一个坏主意,因为你的EditBox是NULL,它将不再是一个编辑器:
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
}
};
希望这能指出你正确的方向
答案 2 :(得分:20)
尝试:android:editable="false"
或android:inputType="none"
答案 3 :(得分:14)
您也可以直接在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
}
}
答案 4 :(得分: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);
}
请参阅此问答,了解为何需要复杂的API 21前版本来撤消setTextIsSelectable(true)
:
我已在高级API设备上测试了setShowSoftInputOnFocus
,但在下面的@ androiddeveloper评论之后,我发现需要对此进行更全面的测试。
以下是一些剪切和粘贴代码,可帮助您测试此答案。如果您可以确认它对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);
}
}
}
答案 5 :(得分:8)
将以下属性添加到布局文件中的Edittext控制器
<Edittext
android:focusableInTouchMode="true"
android:cursorVisible="false"
android:focusable="false" />
我使用这种解决方案已有一段时间了,对我来说效果很好。
答案 6 :(得分:6)
我发现这个解决方案对我有用。当在正确的位置单击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;
}
});
答案 7 :(得分:6)
在StackOverflow上从多个地方收集解决方案,我想下一个总结了它:
如果您不需要在活动的任何位置显示键盘,您只需使用下一个用于对话框的标记(来自here):
getWindow().setFlags(WindowManager.LayoutParams.FLAG_ALT_FOCUSABLE_IM, WindowManager.LayoutParams.FLAG_ALT_FOCUSABLE_IM);
如果您不希望仅针对特定的EditText,可以使用此功能(来自here):
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;
}
或者这(取自here):
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP)
editText.setShowSoftInputOnFocus(false);
else
editText.setTextIsSelectable(true);
答案 8 :(得分:5)
// 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);
答案 9 :(得分:4)
刚设置:
NoImeEditText.setInputType(0);
或在构造函数中:
public NoImeEditText(Context context, AttributeSet attrs) {
super(context, attrs);
setInputType(0);
}
答案 10 :(得分:3)
添加到Alex Kucherenko解决方案:调用setInputType(0)
后光标消失的问题是由于ICS(和JB)上的框架错误。
此处记录了错误:https://code.google.com/p/android/issues/detail?id=27609。
要解决此问题,请在setRawInputType(InputType.TYPE_CLASS_TEXT)
电话后立即致电setInputType
。
要阻止键盘显示,只需覆盖EditText的OnTouchListener
并返回true(吞下触摸事件):
ed.setOnTouchListener(new OnTouchListener() {
@Override
public boolean onTouch(View v, MotionEvent event) {
return true;
}
});
光标出现在GB设备而不是ICS +上的原因让我把头发弄了几个小时,所以我希望这可以节省一些人的时间。
答案 11 :(得分:1)
这对我有用。
首先在您的活动下的Android清单文件中添加此android:windowSoftInputMode="stateHidden"
。如下所示:
<activity ... android:windowSoftInputMode="stateHidden">
然后在onCreate youractivity方法中,添加以下代码:
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时也会隐藏键盘。
答案 12 :(得分:1)
只需将此行放在清单中的活动标签内 android:windowSoftInputMode =“ stateHidden”
答案 13 :(得分:0)
editText.setShowSoftInputOnFocus(false);
答案 14 :(得分:-1)
我不知道这个答案是否更好,但是我找到了一个可能更快的解决方案。在XML上,只需在EditText上放置以下属性即可:
android:focusable="true"
android:focusableInTouchMode="false"
然后使用onClickListener进行所需的操作。