77 votes

Désactiver le clavier virtuel sur NumberPicker

Je suis en train de désactiver le clavier lors de l'utilisation d'un NumberPicker pour entrer des valeurs numériques (pour des raisons esthétiques). C'est ma mise en page-xml-code:

<?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'ai essayer de bloquer le clavier dans le onCreate()-méthode:

// 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 apparaît toujours lorsque l'on clique sur un NumberPicker. Des idées?

261voto

Andrew Webber Points 1446

Je viens de trouver ce et il fonctionne comme un charme:

myNumberPicker.setDescendantFocusability(NumberPicker.FOCUS_BLOCK_DESCENDANTS);

6voto

damaxxed Points 631

Après la lecture par le biais de la com/android/internal/widget/NumberPicker.java le code source je suis arrivé à la solution suivante:

// Hide soft keyboard on NumberPickers by overwriting the OnFocusChangeListener
OnFocusChangeListener fcl = new OnFocusChangeListener() {
    public void onFocusChange(View v, boolean hasFocus) {
        // Do nothing to suppress keyboard
    }
};

((EditText) numberPicker.getChildAt(1)).setOnFocusChangeListener(fcl);

// Suppress soft keyboard from the beginning
((EditText) numberPicker.getChildAt(1)).setInputType(InputType.TYPE_NULL);

6voto

havexz Points 6707

Juste amélioré le @MaxVogler 's ans (donc si wannt vote, ce vote @MaxVogler trop) et en faire une robuste hack. Aussi nous n'avons pas besoin d'appeler setOnFocusChangeListener et setInputType. Seulement setFocusable de la valeur faux faire.

Ci-dessous est un helper api pour activer/désactiver la fonction

public static void enableNumberPickerManualEditing(NumberPicker numPicker,
        boolean enable) {
    int childCount = numPicker.getChildCount();

    for (int i = 0; i < childCount; i++) {
        View childView = numPicker.getChildAt(i);

        if (childView instanceof EditText) {
            EditText et = (EditText) childView;
            et.setFocusable(enable);
            return;
        }
    }
}

3voto

Dave Haines Points 11

Voici une autre façon de faire qui permet à l'utilisateur de modifier un numéro de téléphone si ils veulent juste que cela supprime le clavier à l'origine. Utilisation NumberPicker.setDescendantFocusability(FOCUS_BLOCK_DESCENDANTS) pour supprimer le clavier lorsque l'interface montre d'abord que par les réponses ci-dessus. Puis obtenir votre dialogue ou de l'activité à mettre en œuvre la Vue.OnTouchListener, appel setOnTouchListener(ce) sur votre NumberPicker, et de la mise en œuvre de onTouch(View v,MotionEvent e) réinitialiser le numberpicker descendant focalisation à sa valeur normale, puis retourne la valeur false.

Renvoyer false signifie que le tactile est toujours traitées par le NumberPicker, ce qui signifie que si l'utilisateur appuie sur la zone d'édition, le clavier virtuel apparaît. C'est exactement ce que je voulais confrontés au même problème - avoir le clavier venir avec la boîte de dialogue lors de la première montre déplaît car il déplace la boîte de dialogue après elle apparaît.

public class GetBufferDialog extends DialogFragment implements View.OnTouchListener {

après la création de la boîte de Dialogue dans le onCreateDialog() la méthode et la recherche de la NumberPicker:

m_oldFocus = m_numberpicker.getDescendantFocusability();
m_numberpicker.setDescendantFocusability(NumberPicker.FOCUS_BLOCK_DESCENDANTS); 
m_numberpicker.setOnTouchListener(this);

et voici le OnTouch méthode:

public boolean onTouch(View v, MotionEvent event) {
    m_numberpicker.setDescendantFocusability(m_oldFocus);
    return false;
}

2voto

bapjg Points 1

Le plus simple que j'ai trouvé c'est :

numberPicker               = (NumberPicker) myDialogView.findViewById(R.id.myViewId);
EditText numberPickerChild = (EditText) numberPicker.getChildAt(0);
numberPickerChild.setFocusable(false);
numberPickerChild.setInputType(InputType.TYPE_NULL);

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by: