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?
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"
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"/>
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);
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;
}
}
}
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;
}
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"/>
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);
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) {
}
});
/**
* 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
Arbeitscode Programmatisch:
mp.setDescendantFocusability(NumberPicker.FOCUS_BLOCK_DESCENDANTS);
XML:
Android:descendantFocusability="blocksDescendants"