J'essaie de désactiver le clavier virtuel lors de l'utilisation d'un NumberPicker pour entrer des valeurs numériques (pour des raisons esthétiques). Voici mon code layout-xml:
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical" >
<LinearLayout
android:id="@+id/linearLayout2"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="center_horizontal"
android:layout_marginBottom="30dp"
android:layout_marginTop="30dp" >
<NumberPicker
android:id="@+id/repetitionPicker"
android:layout_width="40dp"
android:layout_height="wrap_content" />
<TextView
android:id="@+id/textView1"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="center_vertical"
android:text="@string/repetitions_short_divider"
android:textAppearance="?android:attr/textAppearanceMedium" />
<NumberPicker
android:id="@+id/weightPicker"
android:layout_width="40dp"
android:layout_height="wrap_content"
android:layout_marginLeft="40dp" />
<TextView
android:id="@+id/textView2"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="center_vertical"
android:text="@string/pounds"
android:textAppearance="?android:attr/textAppearanceMedium" />
</LinearLayout>
<Button
android:id="@+id/saveButton"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="center_horizontal"
android:text="@string/save" />
</LinearLayout>
Et enfin c'est le code où j'essaye de bloquer le clavier dans la méthode onCreate () -:
// hide keyboard
View.OnClickListener disableKeyBoardListener = new View.OnClickListener() {
public void onClick(View v) {
((InputMethodManager) getSystemService(Context.INPUT_METHOD_SERVICE))
.hideSoftInputFromWindow(v.getWindowToken(), InputMethodManager.HIDE_NOT_ALWAYS);
}
};
((EditText) weightPicker.getChildAt(1)).setInputType(InputType.TYPE_NULL);
((EditText) repetitionPicker.getChildAt(1)).setInputType(InputType.TYPE_NULL);
((EditText) weightPicker.getChildAt(1)).setOnClickListener(disableKeyBoardListener);
//((EditText) repetitionPicker.getChildAt(1)).setOnClickListener(disableKeyBoardListener);
//weightPicker.setOnClickListener(disableKeyBoardListener);
//repetitionPicker.setOnClickListener(disableKeyBoardListener);
getWindow().setSoftInputMode(
WindowManager.LayoutParams.SOFT_INPUT_STATE_ALWAYS_HIDDEN);
Malheureusement, le clavier virtuel apparaît toujours lorsque vous cliquez sur un NumberPicker. Des idées?
Version XML de la réponse d'Andrew Webber
Exemple
la source
Après avoir lu le code source com / android / internal / widget / NumberPicker.java, je suis arrivé à la solution suivante:
la source
Simplement amélioré les ans de @MaxVogler (donc si vous ne voulez pas voter ce vote @MaxVogler aussi) et en faire un hack robuste. Nous n'avons pas non plus besoin d'appeler
setOnFocusChangeListener
etsetInputType
. SeulsetFocusable
le faux fera l'affaire.Vous trouverez ci-dessous une API d'assistance pour activer / désactiver la fonctionnalité
la source
Voici une autre façon de le faire qui permet à l'utilisateur de toujours modifier un numéro s'il le souhaite - cela supprime simplement le clavier virtuel au départ. Utilisez
NumberPicker.setDescendantFocusability(FOCUS_BLOCK_DESCENDANTS)
pour supprimer le clavier virtuel lorsque l'interface s'affiche pour la première fois selon les réponses ci-dessus. Ensuite, demandez à votre boîte de dialogue ou à votre activité de mettre en œuvreView.OnTouchListener
, appelezsetOnTouchListener(this)
votreNumberPicker
, et dans votre implémentation,onTouch(View v,MotionEvent e)
réinitialisez la focalisabilité descendante de numberpicker à sa valeur normale, puis retournez false.Renvoyer false signifie que le toucher est toujours traité par NumberPicker, ce qui signifie que si l'utilisateur appuie sur la zone d'édition, le clavier virtuel apparaît. Cela se trouve être exactement ce que je voulais face au même problème - avoir le clavier virtuel avec la boîte de dialogue quand il apparaît pour la première fois est déplaisant car il déplace la boîte de dialogue après son apparition.
après avoir créé le Dialog dans la
onCreateDialog()
méthode et avoir trouvé le NumberPicker:et voici la méthode OnTouch:
la source
Le plus simple que j'ai trouvé pour travailler était:
la source
Si vous souhaitez uniquement masquer le clavier logiciel lors du chargement de la vue avec votre sélecteur de numéro, mais que vous souhaitez toujours que les utilisateurs puissent modifier après le chargement de la vue, vous ne devez pas bloquer la focalisation descendante. Au lieu de cela, empêchez simplement le sélecteur de nombres d'être le premier élément ciblé de votre vue.
Voir cette réponse pour plus de détails.
Basé sur la réponse ci-dessus:
la source
Je ne sais pas pourquoi cela fonctionne, mais la configuration d'OnClickListener qui ne fait rien n'empêche le clavier de s'afficher (Lollipop)
la source
* appelant ceci:
ne bloquera pas la focalisation descendante (le sélecteur de nombre sera modifiable)
masquera l'entrée logicielle lors de la création
avant (traitement de l'entrée) getValue () permettra d'obtenir une valeur correcte
la source
Code de travail par programme :
XML:
la source