Próbuję dezaktywować klawiaturę programową, gdy używam NumberPicker do wprowadzania wartości liczbowych (ze względów estetycznych). To jest mój kod układu-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>
I na koniec jest to kod, w którym próbuję zablokować klawiaturę w metodzie 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);
Niestety, po kliknięciu elementu NumberPicker nadal pojawia się klawiatura programowa. Jakieś pomysły?
Wersja XML odpowiedzi Andrew Webbera
Przykład
źródło
Po przeczytaniu kodu źródłowego com / android / internal / widget / NumberPicker.java dotarłem do następującego rozwiązania:
źródło
Właśnie ulepszyliśmy odpowiedzi @MaxVogler (więc jeśli nie chcesz głosować w tym głosowaniu również @MaxVogler) i uczyń z niego solidnego hacka. Nie musimy też dzwonić
setOnFocusChangeListener
isetInputType
. TylkosetFocusable
fałsz zrobi.Poniżej znajduje się pomocniczy interfejs API do włączania / wyłączania tej funkcji
źródło
Oto inny sposób, aby to zrobić, który pozwala użytkownikowi nadal edytować numer, jeśli chce - po prostu początkowo wyłącza klawiaturę programową. Służy
NumberPicker.setDescendantFocusability(FOCUS_BLOCK_DESCENDANTS)
do wyłączania klawiatury ekranowej, gdy interfejs wyświetla się po raz pierwszy zgodnie z powyższymi odpowiedziami. Następnie weź swoje okno dialogowe lub działanie do zaimplementowaniaView.OnTouchListener
, zadzwońsetOnTouchListener(this)
do swojegoNumberPicker
, aw swojej implementacjionTouch(View v,MotionEvent e)
zresetuj możliwość ustawiania ostrości potomka Numberpicker do normalnej wartości, a następnie zwróć false.Zwrócenie wartości false oznacza, że dotknięcie jest nadal przetwarzane przez NumberPicker, co oznacza, że jeśli użytkownik dotknie pola edycji, pojawi się klawiatura programowa. Tak się składa, że jest to dokładnie to, co chciałem zmierzyć się z tym samym problemem - posiadanie miękkiej klawiatury przy wyświetlaniu okna dialogowego po raz pierwszy jest niezadowalające, ponieważ przesuwa okno dialogowe w górę po jego pojawieniu się.
po utworzeniu Dialogu w
onCreateDialog()
metodzie i znalezieniu NumberPicker:a oto metoda OnTouch:
źródło
Najprostszy, jaki znalazłem, to:
źródło
Jeśli chcesz tylko ukryć klawiaturę programową podczas ładowania widoku za pomocą selektora numerów, ale nadal chcesz, aby użytkownicy mogli edytować po załadowaniu widoku, nie powinieneś blokować możliwości ustawiania ostrości na elementach potomnych. Zamiast tego po prostu nie pozwól, aby selektor liczb był pierwszym aktywnym elementem w widoku.
Zobacz tę odpowiedź, aby uzyskać szczegółowe informacje.
Na podstawie powyższej odpowiedzi:
źródło
Nie wiem, dlaczego to działa, ale ustawienie OnClickListener, które nic nie zapobiega wyświetlaniu klawiatury (Lollipop)
źródło
* nazywając to:
nie będzie blokować ostrości potomków (wybieranie numerów będzie edytowalne)
ukryje miękkie dane wejściowe podczas tworzenia
before (przetwarzanie danych wejściowych) getValue () pozwoli uzyskać właściwą walue
źródło
Kod roboczy Programowo:
XML:
źródło