Je suis venu à peu près aussi loin que ceci qui me mène à mi-chemin, mais pas tout à fait. J'ai un numéroteur Fragment
qui a tous les Button
s habituels pour entrer un numéro, y compris le retour arrière, de sorte que je n'ai pas besoin du clavier logiciel. Je voudrais également donner à l'utilisateur la possibilité de coller du texte (clic long ... ça marche bien par défaut), ainsi que de modifier ce qui a été entré pour que j'ai besoin du curseur.
Le moyen le plus simple que j'ai trouvé pour m'assurer que le clavier logiciel n'apparaît pas si l'utilisateur clique sur la variable EditText
consiste à définir la variable inputType
sur null - mais cela tue également le curseur.
Alors, comment déclarer ma EditText
et quel type de commandes dois-je lancer pour que mon champ EditText
ne montre jamais le clavier virtuel, quelles que soient les tentatives de l'utilisateur, tout en conservant la fonctionnalité de collage et le curseur?
J'ai également essayé Android:windowSoftInputMode="stateAlwaysHidden"
dans mon manifeste, mais en vain.
Cela a fonctionné pour moi:
// Update the EditText so it won't popup Android's own keyboard, since I have my own.
EditText editText = (EditText)findViewById(R.id.edit_mine);
editText.setOnTouchListener(new OnTouchListener() {
@Override
public boolean onTouch(View v, MotionEvent event) {
v.onTouchEvent(event);
InputMethodManager imm = (InputMethodManager)v.getContext().getSystemService(Context.INPUT_METHOD_SERVICE);
if (imm != null) {
imm.hideSoftInputFromWindow(v.getWindowToken(), 0);
}
return true;
}
});
J'ai enfin trouvé une solution de travail (pour moi).
Première partie (dans onCreate):
// Set to TYPE_NULL on all Android API versions
mText.setInputType(InputType.TYPE_NULL);
// for later than GB only
if (Android.os.Build.VERSION.SDK_INT >= 11) {
// this fakes the TextView (which actually handles cursor drawing)
// into drawing the cursor even though you've disabled soft input
// with TYPE_NULL
mText.setRawInputType(InputType.TYPE_CLASS_TEXT);
}
De plus, Android: textIsSelectable doit être défini sur true (ou défini dans onCreate) et le champ EditText ne doit pas être concentré sur l'initialisation. Si votre EditText est la première vue focalisable (ce qui était dans mon cas), vous pouvez contourner ce problème en le plaçant juste au-dessus:
<LinearLayout
Android:layout_width="0px"
Android:layout_height="0px"
Android:focusable="true"
Android:focusableInTouchMode="true" >
<requestFocus />
</LinearLayout>
Vous pouvez en voir les résultats dans l'application Grapher, gratuite et disponible dans Google Play.
Définir l'indicateur textIsSelectable sur true désactive le clavier logiciel.
Vous pouvez le définir dans votre mise en page XML comme suit:
<EditText
Android:id="@+id/editText"
...
Android:textIsSelectable="true"/>
Ou par programme, comme ceci:
EditText editText = (EditText) findViewById(R.id.editText);
editText.setTextIsSelectable(true);
Le curseur sera toujours présent, vous pourrez sélectionner/copier/couper/coller mais le clavier logiciel ne s'affichera jamais.
C'est ce que j'ai fait. Premièrement, dans l'activité manifeste à l'intérieur
Android:windowSoftInputMode="stateAlwaysHidden|adjustNothing"
Deuxièmement, dans onCreate
si activité interne ou onActivityCreated
si dans fragment
editText.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
hideSoftKeyboard(v);
}
});
N'oubliez pas de demander le focus sur le editText
editText.requestFocus();
Ajoutez ensuite la méthode hideSoftKeyboard(v)
comme l’autre réponse.
private void hideSoftKeyboard(View v){
InputMethodManager inputMethodManager = (InputMethodManager) getSystemService(Context.INPUT_METHOD_SERVICE);
inputMethodManager.hideSoftInputFromWindow(v.getWindowToken(), 0);
}
La clé ici est de demanderFocus avant de cliquer sur EditText. Si sans focus, le premier clic fera apparaître le clavier (mon expérience). Toutefois, cela s'applique si vous avez un seul EditText dans une activité. Avec cela, vous pouvez toujours taper avec un clavier personnalisé (le cas échéant), pouvez copier et coller, et le curseur est toujours visible.
La fonctionnalité exacte dont vous avez besoin est fournie en définissant l'indicateur textIsSelectable
dans EditText sur true. Avec cela, le curseur sera toujours présent et vous pourrez sélectionner/copier/couper/coller, mais SoftKeyboard ne s'affichera jamais} _. Nécessite l'API 11 et les versions ultérieures.
Vous pouvez le définir dans votre mise en page XML comme suit:
<EditText
Android:textIsSelectable="true"
...
/>
Ou par programme, comme ceci:
EditText editText = (EditText) findViewById(R.id.editText);
editText.setTextIsSelectable(true);
Pour toute personne utilisant l’API 10 et les versions antérieures, le hack est fourni ici: https://stackoverflow.com/a/20173020/7550472
utilisation
Android:windowSoftInputMode="stateHidden"
dans votre fichier manifeste au lieu de Android:windowSoftInputMode="stateAlwaysHidden"
Meilleure solution de @Lupsaa ici :
Définir l'indicateur textIsSelectable sur true désactive le clavier logiciel.
Vous pouvez le définir dans votre mise en page XML comme suit:
<EditText
Android:id="@+id/editText"
...
Android:textIsSelectable="true"/>
Ou par programme, comme ceci:
EditText editText = (EditText) findViewById(R.id.editText);
editText.setTextIsSelectable (true);
Le curseur sera toujours présent, vous pourrez sélectionner/copier/couper/coller mais le clavier logiciel ne s'affichera jamais.
EditText text = (EditText) findViewById(R.id.text);
if (Build.VERSION.SDK_INT >= 11) {
text.setRawInputType(InputType.TYPE_CLASS_TEXT);
text.setTextIsSelectable(true);
} else {
text.setRawInputType(InputType.TYPE_NULL);
text.setFocusable(true);
}
Ajoutez d’abord Android:windowSoftInputMode="stateHidden"
dans votre fichier manifeste, sous l’activité. comme ça
<activity... Android:windowSoftInputMode="stateHidden">
Le sur votre XML ajouter ce Android:textIsSelectable="true"
. Cela rendra le pointeur visible.
Ensuite, sur la méthode onCreate de l'activité, ajoutez ceci:
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;
}
});
Cela fonctionne parfaitement (pour moi) en 2 étapes:
<activity... Android:windowSoftInputMode="stateHidden">
dans le fichier manifeste
Ajoutez ces propriétés dans votre code XML editText
Android:focusable="true"
Android:focusableInTouchMode="true
Vous devez mettre les deux 1 et 2, alors seulement cela fonctionnera.
À votre santé
Vous pouvez utiliser la ligne de code suivante dans la méthode onCreate de l'activité pour vous assurer que le clavier apparaît uniquement lorsqu'un utilisateur clique ou touche dans un champ EditText. J'ai essayé beaucoup de méthodes et de codes à partir de stackoverflow, mais cela n'a pas fonctionné, mais thisWorks Perfectly for me !! Essayez ceci ..:) `
this.getWindow().setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_STATE_ALWAYS_HIDDEN);
EditText editText = (EditText) findViewById (R.id.edit_mine); editText.setOnTouchListener (nouveau OnTouchListener () {
@Override
public boolean onTouch(View v, MotionEvent event) {
v.onTouchEvent(event);
InputMethodManager imm = (InputMethodManager)v.getContext().getSystemService(Context.INPUT_METHOD_SERVICE);
if (imm != null) {
imm.hideSoftInputFromWindow(v.getWindowToken(), 0);
}
return true;
}
});
ha ... c'est la bonne façon de faire ... ce travail est fait ... ça va marcher!
Vous pouvez utiliser la ligne de code suivante dans la méthode onCreate de l'activité pour vous assurer que le clavier apparaît uniquement lorsqu'un utilisateur clique ou touche dans un champ EditText. J'ai essayé beaucoup de méthodes et de codes à partir de stackoverflow mais je n'ai pas fonctionné, mais cela fonctionne parfaitement pour moi !! Essayez ceci ..:) `
this.getWindow().setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_STATE_ALWAYS_HIDDEN);