Deaktivieren Sie die Softtastatur in NumberPicker

168

Ich versuche, die Softtastatur zu deaktivieren, wenn ich einen NumberPicker zur Eingabe numerischer Werte verwende (aus ästhetischen Gründen). Das ist mein Layout-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>

Und schließlich ist dies der Code, mit dem ich versuche, die Tastatur in der onCreate () - Methode zu blockieren:

// 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); 

Leider wird die Softtastatur immer noch angezeigt, wenn Sie auf einen NumberPicker klicken. Irgendwelche Ideen?

damaxxed
quelle

Antworten:

475

Habe das gerade gefunden und es funktioniert wie ein Zauber:

myNumberPicker.setDescendantFocusability(NumberPicker.FOCUS_BLOCK_DESCENDANTS);

Sie können dies auch in XML festlegen:

android:descendantFocusability="blocksDescendants" 
Andrew Webber
quelle
1
Sofern mir nichts fehlt, ist die Möglichkeit, einen Wert für den NumberPicker einzugeben, nicht mehr möglich. Es ist nicht unbedingt eine schlechte Sache, abhängig davon, wie Sie den Picker verwenden, aber es scheint eine Einschränkung der Lösung zu sein.
frenziedherring
76
Sie können dies auch in XML festlegen: android: descantFocusability = "blocksDescendants"
Ben Clayton
1
Aaah, blockiert natürlich Nachkommen. Vielen Dank :)
Lev
Erstaunliche Lösung, hat mich gerettet!
Hamzeh Soboh
56

XML-Version von Andrew Webbers Antwort

android:descendantFocusability="blocksDescendants"

Beispiel

<NumberPicker
        android:id="@+id/your_numberpicker"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:descendantFocusability="blocksDescendants"/>
G_V
quelle
7

Nachdem ich den Quellcode com / android / internal / widget / NumberPicker.java gelesen hatte, kam ich zu folgender Lösung:

// 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);
damaxxed
quelle
Ja, ich musste die untergeordneten Ansichten des NumberPicker direkt bearbeiten. Die Android-API ist manchmal sehr spärlich.
Damaxxed
6

Verbessere einfach die Ans von @MaxVogler (also wenn du diese Abstimmung auch für @MaxVogler stimmen willst) und mache es zu einem robusten Hack. Auch müssen wir nicht anrufen setOnFocusChangeListenerund setInputType. Nur setFocusablezu falsch wird reichen.

Unten finden Sie eine Hilfs-API zum Aktivieren / Deaktivieren der Funktion

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;
        }
    }
}
havexz
quelle
4

Hier ist eine andere Möglichkeit, die es dem Benutzer ermöglicht, eine Nummer noch zu bearbeiten, wenn er möchte - sie unterdrückt zunächst nur die Softtastatur. Verwenden Sie NumberPicker.setDescendantFocusability(FOCUS_BLOCK_DESCENDANTS)diese Option , um die Softtastatur zu unterdrücken, wenn die Benutzeroberfläche zum ersten Mal gemäß den obigen Antworten angezeigt wird. Lassen Sie dann Ihren Dialog oder Ihre Aktivität implementieren View.OnTouchListener, rufen Sie setOnTouchListener(this)Ihre auf NumberPickerund setzen Sie bei Ihrer Implementierung onTouch(View v,MotionEvent e)die Fokussierbarkeit der Nachkommen des Nummernwählers auf ihren normalen Wert zurück, und geben Sie dann false zurück.

Die Rückgabe von false bedeutet, dass die Berührung weiterhin vom NumberPicker verarbeitet wird. Wenn der Benutzer auf das Bearbeitungsfeld tippt, wird die Softtastatur angezeigt. Dies ist genau das, was ich mit dem gleichen Problem konfrontiert haben wollte - es ist unangenehm, wenn die Softtastatur beim ersten Anzeigen den Dialog anzeigt, da sie den Dialog nach dem Erscheinen nach oben verschiebt.

public class GetBufferDialog extends DialogFragment implements View.OnTouchListener {

Nachdem Sie den Dialog in der onCreateDialog()Methode erstellt und den NumberPicker gefunden haben:

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

und hier ist die OnTouch-Methode:

public boolean onTouch(View v, MotionEvent event) {
    m_numberpicker.setDescendantFocusability(m_oldFocus);
    return false;
}
Dave Haines
quelle
1
Nur dieser hat mir geholfen, mein Problem zu lösen.
Vielen
2

Die einfachste Arbeit, die ich fand, war:

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

Wenn Sie die Softwaretastatur nur beim Laden der Ansicht mit Ihrer Nummernauswahl ausblenden möchten, die Benutzer jedoch nach dem Laden der Ansicht noch bearbeiten können sollen, sollten Sie die Fokussierbarkeit von Nachkommen nicht blockieren. Verhindern Sie stattdessen einfach, dass die Nummernauswahl das erste fokussierte Element in Ihrer Ansicht ist.

Siehe diese Antwort für Details.

Basierend auf der obigen Antwort:

    <!-- Dummy item to prevent Number Picker from receiving focus -->
    <LinearLayout        
        android:focusable="true" 
        android:focusableInTouchMode="true"
        android:layout_width="0px" 
        android:layout_height="0px"/>

    <!-- :nextFocusUp and :nextFocusLeft have been set to the id of this component 
         to prevent the dummy from receiving focus again -->
    <NumberPicker 
        android:id="@+id/number_picker"
        android:layout_width="wrap_content" 
        android:layout_height="wrap_content"
        android:nextFocusUp="@id/number_picker" 
        android:nextFocusLeft="@id/number_picker"/>
eckc
quelle
1

Ich weiß nicht, warum es funktioniert, aber die Einstellung von OnClickListener, die nichts bewirkt, verhinderte die Anzeige der Tastatur (Lollipop)

numberPicker.setOnClickListener(new View.OnClickListener() {
  @Override
  public void onClick(View view) {
  }
});
user4215456
quelle
0
/**
 * set focus to top level window
 * disposes descendant focus
 * disposes softInput
 * @param context - activity context
 * @param enable - state of focus
 * */
public static void topLevelFocus(Context context, boolean enable){
    if(Activity.class.isAssignableFrom(context.getClass())){
        ViewGroup tlView = (ViewGroup) ((Activity) context).getWindow().getDecorView();
        if(tlView!=null){
            tlView.setFocusable(enable);
            tlView.setFocusableInTouchMode(enable);
            tlView.setDescendantFocusability(ViewGroup.FOCUS_BEFORE_DESCENDANTS);
            tlView.requestFocus();
        }
    }
}

* nenne das:

  • blockiert nicht die Fokussierbarkeit von Nachkommen (Numberpicker kann bearbeitet werden)

  • blendet weiche Eingaben beim Erstellen aus

  • Vor (Verarbeitung der Eingabe) getValue () ermöglicht es, die richtige Sprache zu erhalten


ceph3us
quelle
0

Arbeitscode Programmatisch:

mp.setDescendantFocusability(NumberPicker.FOCUS_BLOCK_DESCENDANTS);

XML:

android:descendantFocusability="blocksDescendants" 
Vinayak
quelle