J'ai une activité avec des champs EditText et des boutons comme commodité pour ce qui serait normalement utilisé pour remplir ces champs. Cependant, lorsque l'utilisateur touche l'un des champs EditText, le clavier virtuel Android apparaît automatiquement. Je veux qu'il reste masqué par défaut, à moins que l'utilisateur appuie longuement sur le bouton de menu. J'ai cherché une solution à cela et j'ai trouvé plusieurs réponses, mais je ne peux pas les faire fonctionner jusqu'à présent.
J'ai essayé ce qui suit:
1 - Dans la méthode onCreate,
this.getWindow().setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_STATE_ALWAYS_HIDDEN);
2 - Toujours dans la méthode onCreate,
InputMethodManager imm = (InputMethodManager)getSystemService(Context.INPUT_METHOD_SERVICE);
imm.hideSoftInputFromWindow(editText.getWindowToken(), InputMethodManager.HIDE_IMPLICIT_ONLY);
3 - et dans le fichier Manifest,
<activity Android:name=".activityName" Android:windowSoftInputMode="stateAlwaysHidden"/>
Aucune de ces méthodes ne fonctionne. Chaque fois que l'utilisateur clique sur le champ EditText, le clavier virtuel apparaît. Je veux seulement que le clavier logiciel apparaisse si l'utilisateur le montre explicitement en appuyant longuement sur la touche Menu.
Pourquoi ça ne marche pas?
Cela vous aidera
editText.setInputType(InputType.TYPE_NULL);
Modifier:
Pour afficher le clavier virtuel, vous devez écrire le code suivant dans long key press event of menu button
editText.setInputType(InputType.TYPE_CLASS_TEXT);
editText.requestFocus();
InputMethodManager mgr = (InputMethodManager) getSystemService(Context.INPUT_METHOD_SERVICE);
mgr.showSoftInput(editText, InputMethodManager.SHOW_FORCED);
vous devez ajouter manifeste. Votre fichier manifeste ressemblerait à ceci:
<activity
...
Android:windowSoftInputMode="stateHidden|adjustResize"
...
>
J'utilise parfois un truc pour faire ça. Je mets un porte-focus invisible quelque part sur le dessus de la mise en page. Ce serait par exemple comme ça
<EditText Android:id="@id/editInvisibleFocusHolder"
style="@style/InvisibleFocusHolder"/>
avec ce style
<style name="InvisibleFocusHolder">
<item name="Android:layout_width">0dp</item>
<item name="Android:layout_height">0dp</item>
<item name="Android:focusable">true</item>
<item name="Android:focusableInTouchMode">true</item>
<item name="Android:inputType">none</item>
</style>
puis dans onResume j'appellerais
editInvisibleFocusHolder.setInputType(InputType.TYPE_NULL);
editInvisibleFocusHolder.requestFocus();
Cela fonctionne bien pour moi de 1.6 à 4.x
Après une longue recherche dans la classe TextView, j'ai trouvé un moyen d'empêcher le clavier d'apparaître. Le truc est de le cacher juste après son apparition, j'ai donc cherché une méthode appelée après que le clavier apparaisse et le cache.
Classe EditText implémentée
public class NoImeEditText extends EditText {
public NoImeEditText(Context context, AttributeSet attrs) {
super(context, attrs);
}
/**
* This method is called before keyboard appears when text is selected.
* So just hide the keyboard
* @return
*/
@Override
public boolean onCheckIsTextEditor() {
hideKeyboard();
return super.onCheckIsTextEditor();
}
/**
* This methdod is called when text selection is changed, so hide keyboard to prevent it to appear
* @param selStart
* @param selEnd
*/
@Override
protected void onSelectionChanged(int selStart, int selEnd) {
super.onSelectionChanged(selStart, selEnd);
hideKeyboard();
}
private void hideKeyboard(){
InputMethodManager imm = (InputMethodManager) getContext().getSystemService(Context.INPUT_METHOD_SERVICE);
imm.hideSoftInputFromWindow(getWindowToken(), 0);
}
}
et le style
<com.my.app.CustomViews.NoImeEditText
Android:layout_width="match_parent"
Android:layout_height="wrap_content"
Android:editable="false"
Android:background="@null"
Android:textSize="@dimen/cell_text" />
Le clavier logiciel continuait à monter même si je plaçais EditorInfo.TYPE_NULL
dans la vue . Aucune des réponses ne fonctionnait pour moi, à l'exception de l'idée que j'ai eu de la réponse de nik431:
editText.setCursorVisible(false);
editText.setFocusableInTouchMode(false);
editText.setFocusable(false);
Il semble exister diverses méthodes permettant d’empêcher l’apparition du clavier système, à la fois par programme et en XML. Cependant, c’est la méthode qui a fonctionné pour moi tout en prenant en charge les périphériques pré-API 11.
// prevent system keyboard from appearing
if (Android.os.Build.VERSION.SDK_INT >= 11) {
editText.setRawInputType(InputType.TYPE_CLASS_TEXT);
editText.setTextIsSelectable(true);
} else {
editText.setRawInputType(InputType.TYPE_NULL);
editText.setFocusable(true);
}
La ligne suivante est exactement ce qui est recherché. Cette méthode a été incluse avec API 21
, donc elle fonctionne pour API 21
et les versions supérieures.
edittext.setShowSoftInputOnFocus(false);
Essayons de définir les propriétés ci-dessous dans votre code XML pour EditText
Android:focusableInTouchMode="true" Android:cursorVisible="false".
si vous voulez masquer le clavier au lancement, veuillez passer par ceci link
Mon résultat de test:
avec setInputType
:
editText.setInputType(InputType.TYPE_NULL);
le clavier virtuel disparaît, mais le curseur disparaît également.
avec setShowSoftInputOnFocus
:
editText.setShowSoftInputOnFocus(false)
Cela fonctionne comme prévu.
Utilisez simplement EditText.setFocusable(false);
en activité
ou utiliser en XML
Android:focusable="false"
Bonjour Utilisez ce code, il fonctionne à 100% pour moi
EditText ee=new EditText(this);
ee.setShowSoftInputOnFocus(false);
* Mais vous voulez juste cacher le clavier en cliquant sur edittext, le code ci-dessous fonctionnera, mais l'icône du clavier et le signe ascendant du bouton précédent créeront * Le code est comme ça
EditText ee=new EditText(this);//create edittext
final View.OnTouchListener disable =new View.OnTouchListener() {
public boolean onTouch (View v, MotionEvent event) {
v.onTouchEvent(event);
InputMethodManager img =
(InputMethodManager)v.getContext().getSystemService(INPUT_METHOD_SERVICE);
if (img != null) {
img.hideSoftInputFromWindow(v.getWindowToken(),0);
}
return true;
}
};
//call touch listener
ee.setOnTouchListener(disable);
Utilisez-le aussi en cas d'écoute à changement de texte
EditText ee= new EditText(this);
Text=new TextWatcher(){
@Override
public void beforeTextChanged(CharSequence s, int start, int count, int
after) {
InputMethodManager img = (InputMethodManager)
getSystemService(INPUT_METHOD_SERVICE);
img.hideSoftInputFromWindow(ee.getWindowToken(), 0);
}
@Override
public void onTextChanged(CharSequence s, int start, int before, int count) {
InputMethodManager img = (InputMethodManager)
getSystemService(INPUT_METHOD_SERVICE);
img.hideSoftInputFromWindow(ee.getWindowToken(), 0);
}
@Override
public void afterTextChanged(Editable s) {
InputMethodManager img = (InputMethodManager)
getSystemService(INPUT_METHOD_SERVICE);
img.hideSoftInputFromWindow(ee.getWindowToken(), 0);
}
};
ee.addTextChangedListener(Text);
Utilisez-le aussi en cas d'écoute onclick
EditText ee=new EditText(this);
ee.setOnClickListener(new View.OnClickListener() {
public void onClick(View v) {
InputMethodManager img= (InputMethodManager)getSystemService(INPUT_METHOD_SERVICE);
img.hideSoftInputFromWindow(ee.getWindowToken(),0);
}});
Tout le code fonctionnera mais pour moi le premier code est le meilleur
Cacher le clavier
editText.setInputType(InputType.TYPE_NULL);
Afficher le clavier
etData.setInputType(InputType.TYPE_CLASS_TEXT);
etData.setFocusableInTouchMode(true);
dans la mise en page parent
Android:focusable="false"
weekText = (EditText) layout.findViewById(R.id.weekEditText);
weekText.setInputType(InputType.TYPE_NULL);
Utilisez simplement la méthode ci-dessous
private fun hideKeyboard(activity: Activity, editText: EditText) {
editText.clearFocus()
(activity.getSystemService(Context.INPUT_METHOD_SERVICE) as InputMethodManager).hideSoftInputFromWindow(editText.windowToken, 0)
}
Trois manières basées sur la même instruction simple:
une). Des résultats aussi faciles que localiser (1):
Android:focusableInTouchMode="true"
parmi la configuration de tout élément précédent dans la mise en page, exemple:
si toute votre mise en page est composée de:
<ImageView>
<EditTextView>
<EditTextView>
<EditTextView>
alors vous pouvez écrire le (1) parmi les paramètres ImageView et ceci attirera l'attention d'Android sur ImageView au lieu du texte d'édition.
b) Si vous avez un élément précédent à un ImageView, vous devrez peut-être ajouter (2) à (1) en tant que:
Android:focusable="true"
c) vous pouvez également simplement créer un élément vide en haut de votre vue:
<LinearLayout
Android:focusable="true"
Android:focusableInTouchMode="true"
Android:layout_width="0px"
Android:layout_height="0px" />
Jusque-là, cette alternative est la plus simple de toutes. J'espère que ça aide...