Désactiver le clavier sur EditText
je fais une calculatrice.
Donc j'ai fait mon propre Buttons
avec des nombres et des fonctions.
L'expression qui doit être calculée, est dans un EditText
, parce que je veux que les utilisateurs peuvent ajouter des nombres ou des fonctions aussi au milieu de l'expression, ainsi avec le EditText
j'ai le cursor
. Mais je veux désactiver le Keyboard
lorsque les utilisateurs cliquent sur la EditText
.
J'ai trouvé cet exemple que c'est ok pour Android 2.3
, mais avec ICS
désactiver Keyboard
et aussi le curseur.
public class NoImeEditText extends EditText {
public NoImeEditText(Context context, AttributeSet attrs) {
super(context, attrs);
}
@Override
public boolean onCheckIsTextEditor() {
return false;
}
}
et puis j'utilise ce NoImeEditText
dans mon XML
fichier
<com.my.package.NoImeEditText
android:id="@+id/etMy"
....
/>
comment je peux rendre compatible ce texte D'édition avec ICS??? Grâce.
13 réponses
Ici est un site qui va vous donner ce dont vous avez besoin
comme un résumé, il fournit des liens vers InputMethodManager
et View
des Développeurs Android. Il fera référence au getWindowToken
à l'intérieur de View
et hideSoftInputFromWindow()
pour InputMethodManager
Une meilleure réponse est donnée dans le lien, espérons que cette aide.
voici un exemple pour consommer l'événement 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
}
};
voici un autre exemple du même site. Cela prétend fonctionner, mais semble être une mauvaise idée puisque votre boîte D'édition est nulle il ne sera plus un éditeur:
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
}
});
Espère que cela vous mène dans la bonne direction
ci-dessous code is both for API >= 11 and API < 11. Le curseur est toujours disponible.
/**
* 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);
}
}
, essayez: android:editable="false"
ou android:inputType="none"
vous pouvez également utiliser setShowSoftInputOnFocus (booléen) directement sur API 21+ ou par réflexion sur 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
}
}
désactiver le clavier (API 11 à présent)
C'est la meilleure réponse que j'ai trouvé jusqu'à présent pour désactiver le clavier (et j'ai vu beaucoup d'entre eux).
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) { // API 21
editText.setShowSoftInputOnFocus(false);
} else { // API 11-20
editText.setTextIsSelectable(true);
}
il n'est pas nécessaire d'utiliser la réflexion ou de définir le InputType
à null.
réactiver le clavier
, Voici comment réactiver le clavier si nécessaire.
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);
}
voir cette Q & R pour savoir pourquoi la version pré API 21 compliquée est nécessaire pour annuler setTextIsSelectable(true)
:
cette réponse doit être testée de manière plus approfondie.
j'ai testé le setShowSoftInputOnFocus
sur des API supérieures, mais après le commentaire de @androiddddeveloper ci-dessous, je vois que cela doit être testé plus en détail.
voici du code à couper-coller pour aider à tester cette réponse. Si vous pouvez confirmer que cela fonctionne ou non pour L'API 11 à 20, veuillez laisser un commentaire. Je n'ai pas de périphériques API 11-20 et mon émulateur a des problèmes.
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>
activité principale.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);
}
}
}
// 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);
rassembler des solutions de plusieurs endroits ici sur StackOverflow, je pense que le prochain résume:
si vous n'avez pas besoin que le clavier soit affiché n'importe où sur votre activité, vous pouvez simplement utiliser les drapeaux suivants qui sont utilisés pour les dialogues (tiré de ici ) :
getWindow().setFlags(WindowManager.LayoutParams.FLAG_ALT_FOCUSABLE_IM, WindowManager.LayoutParams.FLAG_ALT_FOCUSABLE_IM);
si vous ne le voulez pas seulement pour un texte D'édition spécifique, vous pouvez utiliser ceci (obtenu de ici ) :
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;
}
Ou ce (extrait de ici ) :
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP)
editText.setShowSoftInputOnFocus(false);
else
editText.setTextIsSelectable(true);
j'ai trouvé cette solution qui fonctionne pour moi. Il place également le curseur, lorsque cliqué sur EditText à la bonne 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;
}
});
Juste
NoImeEditText.setInputType(0);
ou dans le constructeur:
public NoImeEditText(Context context, AttributeSet attrs) {
super(context, attrs);
setInputType(0);
}
ajouter les propriétés ci-dessous au contrôleur Edittext dans le fichier layout
<Edittext
android:focusableInTouchMode="true"
android:cursorVisible="false"
android:focusable="false" />
j'utilise cette solution depuis longtemps et elle fonctionne très bien pour moi.
pour ajouter à la solution D'Alex Kucherenko: le problème avec la disparition du curseur après avoir appelé setInputType(0)
est dû à un bug de cadre sur ICS (et JB).
le bug est documenté ici: https://code.google.com/p/android/issues/detail?id=27609 .
pour contourner ce problème, appelez setRawInputType(InputType.TYPE_CLASS_TEXT)
juste après l'appel setInputType
.
pour empêcher le clavier d'apparaître, il suffit de surcharger OnTouchListener
de l'EditText et de renvoyer la valeur true (avaler la touche event):
ed.setOnTouchListener(new OnTouchListener() {
@Override
public boolean onTouch(View v, MotionEvent event) {
return true;
}
});
les raisons pour lesquelles le curseur apparaît sur les appareils GB et non sur ICS+ m'ont fait arracher les cheveux pendant quelques heures, donc j'espère que cela fera gagner du temps à quelqu'un.
ça a marché pour moi.
Ajoutez d'abord ce android:windowSoftInputMode="stateHidden"
dans votre fichier Android manifest, sous votre activité. comme ci-dessous:
<activity ... android:windowSoftInputMode="stateHidden">
ensuite, sur la méthode de création de votre activité, ajouter le code suivant:
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;
}
});
alors si vous voulez que le pointeur soit visible, ajoutez ceci sur votre xml android:textIsSelectable="true"
.
cela rendra le pointeur visible. De cette façon, le clavier ne s'affichera pas lorsque votre activité commence et aussi sera caché lorsque vous cliquez sur edittext.
mettez cette ligne à l'intérieur de l'étiquette d'activité dans le manifeste android: windowSoftInputMode= "stateHidden"