wake-up-neo.com

Deaktivieren Sie die Softtastatur in NumberPicker

Ich versuche, die Soft-Tastatur zu deaktivieren, wenn ich numerische Werte mit einem NumberPicker eingebe (aus ästhetischen Gründen). Dies 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, in 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 weiterhin angezeigt, wenn Sie auf einen NumberPicker klicken. Irgendwelche Ideen?

162
damaxxed

Ich habe das gerade gefunden und es funktioniert wie ein Zauber:

myNumberPicker.setDescendantFocusability(NumberPicker.FOCUS_BLOCK_DESCENDANTS);

Sie können dies auch in XML einstellen:

Android:descendantFocusability="blocksDescendants" 
458
Andrew Webber

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"/>
53
G_V

Nachdem ich den Quellcode von 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);
7
damaxxed

Nur die Ans von @MaxVogler verbessert (wenn Sie diese Abstimmung auch für @MaxVogler vornehmen möchten) und es zu einem robusten Hack machen. Außerdem müssen wir setOnFocusChangeListener und setInputType nicht aufrufen. Nur setFocusable bis false reicht aus.

Unten finden Sie eine Hilfsprogramm-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;
        }
    }
}
6
havexz

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 Soft-Tastatur. Verwenden Sie NumberPicker.setDescendantFocusability(FOCUS_BLOCK_DESCENDANTS), um die Soft-Tastatur zu unterdrücken, wenn die Benutzeroberfläche zum ersten Mal wie oben angegeben angezeigt wird. Lassen Sie dann in Ihrem Dialog oder in Ihrer Aktivität View.OnTouchListener Implementieren, rufen Sie setOnTouchListener(this) auf Ihrem NumberPicker auf und setzen Sie in Ihrer Implementierung von onTouch(View v,MotionEvent e) die Fokussierbarkeit der Nachkommen von Zahlenauswahl auf zurück sein normaler Wert, dann geben Sie false zurück.

Wenn Sie false zurückgeben, wird die Berührung weiterhin vom NumberPicker verarbeitet. Wenn der Benutzer auf das Bearbeitungsfeld tippt, wird die Soft-Tastatur angezeigt. Dies ist genau das, was ich wollte, wenn ich mit dem gleichen Problem konfrontiert bin: Wenn die Softtastatur beim ersten Mal ein Dialogfeld anzeigt, ist dies unangenehm, da das Dialogfeld nach oben verschoben wird, nachdem es angezeigt wird.

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;
}
4
Dave Haines

Wenn Sie die Softwaretastatur nur beim Laden der Ansicht mit Ihrer Nummernauswahl ausblenden möchten, die Benutzer aber nach dem Laden der Ansicht weiterhin bearbeiten können sollen, sollten Sie die Fokussierbarkeit von Nachkommen nicht blockieren. Verhindern Sie stattdessen lediglich, dass der Nummernwähler 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"/>
2
eckc

Das einfachste, was ich zur Arbeit fand, war:

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

Ich weiß nicht, warum es funktioniert, aber das Setzen von OnClickListener, das nichts tut, verhinderte das Anzeigen der Tastatur (Lollipop)

numberPicker.setOnClickListener(new View.OnClickListener() {
  @Override
  public void onClick(View view) {
  }
});
1
user4215456
/**
 * 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();
        }
    }
}

* nennt das:

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

  • verbirgt weiche Eingaben beim Erstellen

  • before (Verarbeiten der Eingabe) getValue () ermöglicht es, den richtigen Wert zu erhalten


0
ceph3us

Arbeitscode Programmatisch:

mp.setDescendantFocusability(NumberPicker.FOCUS_BLOCK_DESCENDANTS);

XML:

Android:descendantFocusability="blocksDescendants" 
0
Vinayak