17

Dla wszystkich,NumberPicker w AlertDialog zawsze aktywuje klawiaturę. Jak to wyłączyć?

Próbuję uzyskać prosty NumberPicker do pracy w AlertDialog. Problem polega na tym, że za każdym razem, gdy zwiększam/zmniejszam wartość w numberpicker, klawiatura aktywuje się.

Istnieje wiele postów opisujących ten problem, ale żadna z sugestii nie działa. Próbowałem:

android:configChanges="keyboard|keyboardHidden" 

I

inputManager.hideSoftInputFromWindow(currentView.getWindowToken(), 0); 

I

getWindow().setSoftInputMode(
    WindowManager.LayoutParams.SOFT_INPUT_STATE_ALWAYS_HIDDEN); 

Próbowałem nazywając tych funkcji przed i po inicjalizacji (dialog.show()), na zdarzeń wciśnięcia klawisza (oczywiście przy użyciu słuchaczy), ale bez powodzenia.

Kompletny kod:

popup.xml

<?xml version="1.0" encoding="utf-8"?> 
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" 
    android:layout_width="fill_parent" 
    android:layout_height="wrap_content" > 
    <NumberPicker 
     android:layout_width="wrap_content" 
     android:layout_height="wrap_content" 
     android:id="@+id/myNumber" 
     android:configChanges="keyboard|keyboardHidden" 
    /> 
</RelativeLayout> 

a funkcja powołanie:

AlertDialog.Builder builder = new AlertDialog.Builder(this); 
builder.setPositiveButton(android.R.string.ok, new DialogInterface.OnClickListener() { 
    public void onClick(DialogInterface dialog, int which) { 
     return; 
    } }); 
builder.setNegativeButton(android.R.string.cancel, new DialogInterface.OnClickListener() { 
    public void onClick(DialogInterface dialog, int which) { 
     return; 
    } }); 
View view = getLayoutInflater().inflate(R.layout.popup, null); 
builder.setView (view); 

final AlertDialog dialog = builder.create(); 
NumberPicker picker = (NumberPicker) view.findViewById(R.id.myNumber); 
picker.setMinValue(0); 
picker.setMaxValue(999); 

dialog.getWindow(). 
    setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_STATE_ALWAYS_HIDDEN); 
dialog.show();  

Każda pomoc mile widziane

Barry

Odpowiedz

24

Faktycznie, mimo że powyższe rozwiązanie działa idealnie, jest łatwiejszy sposób.

picker.setDescendantFocusability(NumberPicker.FOCUS_BLOCK_DESCENDANTS); 

To wszystko, czego potrzeba. W każdym razie, dzięki za odpowiedzi !!!!:-)

+0

Możesz również ustawić to w XML: android: descendantFocusability = "blocksDescendants" – Borzh

1

się Atrybut android:configChanges należy do pliku Manifest.xml, a nie do układu. Ale jeśli ukrywa klawiaturę stamtąd, prawdopodobnie najlepiej z użyciem

android:windowSoftInputMode="stateAlwaysHidden" 

Należy również spróbować użyć getWindow() na Activity raczej niż tylko Dialog i sprawdzić, czy to pomaga. Jest to prawdopodobnie najlepsze rozwiązanie, ponieważ pierwsza (ukryta przed manifestem) pozostawi klawiaturę ukrytą w całym działaniu.

+0

Witam Jave, Dzięki za odpowiedź i swoimi spostrzeżeniami na oczywistych vs plików XML układu. Chodzi o to, że nie mogę dodać tych parametrów do układu, ponieważ układ jest w zasadzie formą. Numerpicker to wyskakujące okienko (alertdialog) w tym formularzu i muszę tylko wyłączyć klawiaturę w tym oknie dialogowym, a nie całą aktywność. Tak już jest przy okazji :-) GetWindow w działaniu był czymś, co już wypróbowałem i niestety nie pomaga – barrel

3

Ponieważ nie ma dostępu do przycisków NumberPicker, jest to "niemożliwe".

Zrobiłem szybki, brudny hack, aby sobie z tym poradzić.

Pierwszy dodać ostrości eater do układu, w tym przypadku przycisk z 0 wielkość:

<?xml version="1.0" encoding="utf-8"?> 
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" 
      android:layout_width="fill_parent" 
      android:layout_height="wrap_content" > 
    <NumberPicker 
     android:layout_width="wrap_content" 
     android:layout_height="wrap_content" 
     android:id="@+id/myNumber" 
     android:configChanges="keyboard|keyboardHidden" 
     /> 
    <Button 
     android:id="@+id/myBtn" 
     android:layout_width="0dp" 
     android:layout_height="0dp" 
     /> 
</RelativeLayout> 

Musimy złapać wydarzenie klikając na przyciski incement/spadek, wybrałem OnValueChangedListener, nie mógł znaleźć coś lepszego.

EditText edit = null; 
    try { 
     final Field[] fields = picker.getClass().getDeclaredFields(); 
     for (Field f : fields) { 
      if (EditText.class.equals(f.getType())) { 
       f.setAccessible(true); 
       edit = (EditText) f.get(picker); 
      } 
     } 
    } catch (IllegalAccessException e) { 
     e.printStackTrace(); //To change body of catch statement use File | Settings | File Templates. 
    } 
    if (edit != null) { 
     final EditText finalEdit = edit; 
     final InputMethodManager imm = (InputMethodManager) getSystemService(Context.INPUT_METHOD_SERVICE); 
     picker.setOnValueChangedListener(new NumberPicker.OnValueChangeListener() { 
      @Override 
      public void onValueChange(NumberPicker numberPicker, int i, int i1) { 
       dialog.findViewById(R.id.myBtn).requestFocusFromTouch(); 
       imm.hideSoftInputFromWindow(finalEdit.getWindowToken(), 0); 
      } 
     }); 
    } 

To nie jest zalecane rozwiązanie. Mam nadzieję, że ktoś znajdzie coś lepszego. Używaj tylko do celów edukacyjnych ;-)

+0

Wow, działa jak urok! Wielkie dzięki :-) – barrel

0

XML:

<NumberPicker 
    ... 
    android:descendantFocusability="blocksDescendants" /> 
Powiązane problemy