私は電卓をやっています。そこで、数字と関数を使って独自の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と互換性のあるものにする方法ありがとう。
ここ は、必要なものを提供するWebサイトです
要約すると、Android開発者からのInputMethodManager
およびView
へのリンクを提供します。getWindowToken
内のView
を参照し、 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
}
};
同じWebサイトの別の例を次に示します。これは機能すると主張していますが、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"
setShowSoftInputOnFocus(boolean) をAPI 21+で直接使用することも、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
}
}
これは、これまでキーボードを無効にするために見つけた最良の答えです(そして、私はそれらの多くを見てきました)。
_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);
}
_
setTextIsSelectable(true)
を取り消すには複雑なAPI 21以前のバージョンが必要な理由については、このQ&Aをご覧ください。
setShowSoftInputOnFocus
を上位のAPIデバイスでテストしましたが、以下の@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);
}
}
}
_
以下のプロパティをレイアウトファイルのEdittextコントローラーに追加します
<Edittext
Android:focusableInTouchMode="true"
Android:cursorVisible="false"
Android:focusable="false" />
私はしばらくの間このソリューションを使用してきましたが、私にとってはうまく機能します。
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);
私はこの解決策を見つけました。また、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;
}
});
// 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);
}
Alex Kucherenkoのソリューションに追加するには、setInputType(0)
を呼び出した後にカーソルが消える問題は、ICS(およびJB))のフレームワークのバグが原因です。
バグはここに文書化されています: https://code.google.com/p/Android/issues/detail?id=27609 。
これを回避するには、setInputType
呼び出しの直後にsetRawInputType(InputType.TYPE_CLASS_TEXT)
を呼び出します。
キーボードの表示を停止するには、EditTextのOnTouchListener
をオーバーライドし、trueを返します(タッチイベントを飲み込みます)。
ed.setOnTouchListener(new OnTouchListener() {
@Override
public boolean onTouch(View v, MotionEvent event) {
return true;
}
});
ICS +ではなくGBデバイスにカーソルが表示される理由により、数時間髪を引き裂くことができたので、これが誰かの時間を節約することを願っています。
これは私のために働いた。最初にこれを追加しますAndroid:windowSoftInputMode="stateHidden"
Androidマニフェストファイル、アクティビティの下。以下のように:
<activity ... Android:windowSoftInputMode="stateHidden">
次に、youractivityの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.setShowSoftInputOnFocus(false);
マニフェストAndroid:windowSoftInputMode = "stateHidden"のアクティビティタグ内にこの行を配置するだけです。