Je fais une calculatrice . J'ai donc créé ma propre Buttons
avec des nombres et des fonctions . L'expression devant être calculée est dans une EditText
, car je veux que les utilisateurs puissent ajouter des nombres ou des fonctions également au milieu. de l'expression, donc avec le EditText
j'ai le cursor
. Mais je veux désactiver la Keyboard
lorsque les utilisateurs cliquent sur la EditText
. J'ai trouvé cet exemple que c'est correct pour Android 2.3
, mais avec ICS
, désactivez la Keyboard
et 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 cette NoImeEditText
dans mon fichier XML
<com.my.package.NoImeEditText
Android:id="@+id/etMy"
....
/>
Comment je peux rendre compatible cet EditText avec ICS ??? Merci.
Ici est un site Web qui vous donnera ce dont vous avez besoin
En résumé, il fournit des liens vers InputMethodManager
et View
à partir de développeurs Android. Il fera référence à getWindowToken
à l'intérieur de View
et hideSoftInputFromWindow()
pour InputMethodManager
Une meilleure réponse est donnée dans le lien, espérons que cela aide.
voici un exemple d'utilisation de 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. Ceci prétend fonctionner mais semble être une mauvaise idée puisque votre EditBox est NULL, 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
}
});
J'espère que ça vous indique la bonne direction
Le code ci-dessous concerne à la fois les API> = 11 et les 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 (boolean) 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
}
}
C’est la meilleure réponse que j’ai trouvée jusqu’à présent pour désactiver le clavier (et j'en ai vu beaucoup).
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 la variable InputType
sur null.
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 ce Q & A pour savoir pourquoi la version complexe de pré API 21 est nécessaire pour annuler setTextIsSelectable(true)
:
J'ai testé la setShowSoftInputOnFocus
sur des appareils avec une API supérieure, mais après le commentaire de @ androiddeveloper ci-dessous, je constate qu'il faut procéder à des tests plus approfondis.
Voici un code copier-coller pour vous aider à tester cette réponse. Si vous pouvez confirmer que cela fonctionne ou non pour les API 11 à 20, veuillez laisser un commentaire. Je n'ai pas de périphérique 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>
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);
}
}
}
Ajoutez les propriétés ci-dessous au contrôleur Edittext dans le fichier de disposition
<Edittext
Android:focusableInTouchMode="true"
Android:cursorVisible="false"
Android:focusable="false" />
J'utilise cette solution depuis un moment et cela fonctionne bien pour moi.
En rassemblant 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ù dans votre activité, vous pouvez simplement utiliser les drapeaux suivants utilisés pour les dialogues (obtenus de ici ):
getWindow().setFlags(WindowManager.LayoutParams.FLAG_ALT_FOCUSABLE_IM, WindowManager.LayoutParams.FLAG_ALT_FOCUSABLE_IM);
Si vous ne le souhaitez pas uniquement pour un EditText 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 ceci (pris 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 vous cliquez sur EditText à la position correcte.
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);
Il suffit de définir:
NoImeEditText.setInputType(0);
ou dans le constructeur:
public NoImeEditText(Context context, AttributeSet attrs) {
super(context, attrs);
setInputType(0);
}
Pour ajouter à la solution Alex Kucherenko: le problème avec le curseur qui disparaît après l'appel de setInputType(0)
est dû à un bogue du framework sur ICS (et JB).
Le bogue 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, remplacez simplement la variable OnTouchListener
de la propriété EditText et renvoyez la valeur true (en avalant l'événement tactile):
ed.setOnTouchListener(new OnTouchListener() {
@Override
public boolean onTouch(View v, MotionEvent event) {
return true;
}
});
Les raisons pour lesquelles le curseur apparaît sur les périphériques GB et non sur ICS + m'ont obligé à me déchirer les cheveux pendant quelques heures. J'espère donc que cela fera gagner du temps à quelqu'un.
editText.setShowSoftInputOnFocus(false);
Il suffit de mettre cette ligne à l’intérieur de la balise d’activité dans le manifeste Android: windowSoftInputMode = "stateHidden"
Cela a fonctionné pour moi ..__ D'abord, ajoutez ceci Android:windowSoftInputMode="stateHidden"
dans votre fichier manifeste Android, sous votre activité. comme ci-dessous:
<activity ... Android:windowSoftInputMode="stateHidden">
Ensuite, sur la méthode onCreate de votre activité, ajoutez 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;
}
});
Ensuite, si vous souhaitez que le pointeur soit visible, ajoutez-le à votre Android:textIsSelectable="true"
xml.
Cela rendra le pointeur visible… .. De cette manière, le clavier ne s'affichera pas au début de votre activité et sera également masqué lorsque vous cliquerez sur le texte.