17

A tutti,NumberPicker in AlertDialog attiva sempre la tastiera. Come disabilitare questo?

Sto cercando di far funzionare un NumberPicker semplice in un AlertDialog. Il problema è che ogni volta che aumento/diminuiso il valore nel numeropicker, la tastiera si attiva.

Ci sono molti post che descrivono questo problema, ma nessuno dei suggerimenti funziona. ho provato:

android:configChanges="keyboard|keyboardHidden" 

E

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

E

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

ho provato a chiamare queste funzioni, prima e dopo l'inizializzazione (dialog.show()), su eventi di pressione (usando ovviamente gli ascoltatori), ecc. ma senza fortuna finora.

Il codice completo:

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> 

E la funzione di chiamata:

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

Qualsiasi aiuto apprezzato

Barry

risposta

24

In realtà, anche se la soluzione di cui sopra funziona perfettamente, c'è un modo più semplice.

picker.setDescendantFocusability(NumberPicker.FOCUS_BLOCK_DESCENDANTS); 

Questo è tutto ciò che è necessario. Comunque, grazie per le risposte !!!!:-)

+0

Puoi anche impostarlo in XML: android: descendantFocusability = "blocksDescendants" – Borzh

1

la L'attributo android:configChanges appartiene al tuo file Manifest.xml, non al layout. Ma se si nasconde la tastiera da lì, si sono probabilmente migliore di utilizzare

android:windowSoftInputMode="stateAlwaysHidden" 

Si dovrebbe anche cercare di utilizzare getWindow() sul Activity piuttosto che solo il Dialog e vedere se questo aiuta. Questa è probabilmente la migliore soluzione in quanto la prima (nascosta dal manifest) manterrà la tastiera nascosta durante l'intera attività.

+0

Ciao Jave, Grazie per la risposta e le vostre intuizioni su manifesto vs XMLs layout. Il fatto è, tuttavia, che non posso aggiungere questi parametri al layout, dal momento che il layout è fondamentalmente una forma. Il numeropicker è un popup (alertdialog) su questo modulo e ho solo bisogno di disabilitare la tastiera in questa finestra di dialogo, non l'intera attività. Questo è ciò che hai già menzionato tra l'altro :-) Il getWindow sull'attività era qualcosa che ho già provato e purtroppo non aiuta – barrel

3

Dato che non è possibile accedere ai pulsanti di NumberPicker, è "impossibile" farlo.

Ho fatto un trucco veloce e sporco per affrontarlo.

Prima aggiungere fuoco mangiatore a disposizione, in questo caso Pulsante con 0 dimensioni:

<?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> 

Abbiamo bisogno di prendere caso di clic sui pulsanti incement/decremento, ho scelto OnValueChangedListener, non riusciva a trovare qualcosa di meglio.

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

questo non è raccomandato soluzione. Spero che qualcuno possa trovare qualcosa di meglio. Utilizzare solo per scopi didattici ;-)

+0

Wow, funziona come un fascino! Grazie mille :-) – barrel

0

XML:

<NumberPicker 
    ... 
    android:descendantFocusability="blocksDescendants" />