133

Sto provando a disattivare la tastiera virtuale quando si utilizza NumberPicker per immettere valori numerici (per motivi estetici). Questo è il mio layout-xml-code:Disattiva la tastiera virtuale su NumberPicker

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

E infine questo è il codice dove cerco di bloccare la tastiera in onCreate() - Metodo:

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

Purtroppo, la tastiera virtuale ancora appare quando si fa clic su un NumberPicker. Qualche idea?

risposta

380

appena trovato questo e funziona come un fascino:

myNumberPicker.setDescendantFocusability(NumberPicker.FOCUS_BLOCK_DESCENDANTS);

È possibile anche impostare questo in XML:

android:descendantFocusability="blocksDescendants" 
+1

A meno che non manchi qualcosa, ciò rimuove la possibilità di digitare un valore per NumberPicker. Non è necessariamente una cosa negativa, a seconda di come stai usando il selettore, ma sembra essere una limitazione della soluzione. – frenziedherring

+67

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

+1

Aaah, blocksDescendants, ofcourse. Grazie mille :) – Lev

6

Dopo la lettura attraverso il/android codice com/interno/widget di/NumberPicker.java fonte ho ottenuto la seguente soluzione:

// 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); 
+0

Bene suo genere di un diritto trucco? – havexz

+0

Sì, ho dovuto modificare direttamente le viste secondarie di NumberPicker. L'API Android a volte è molto scarsa. – damaxxed

+0

+1 per trovare l'hack ... :) – havexz

6

Proprio migliorato ans 's il @MaxVogler (quindi se wannt votare questo voto @MaxVogler anche) e lo rendono un hack robusto. Inoltre non abbiamo bisogno di chiamare setOnFocusChangeListener e setInputType. Verrà eseguito solo da setFocusable a false.

Qui di seguito è un'API helper per abilitare/disabilitare la funzione

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

Ecco un altro modo per farlo che consente L'utente deve ancora modificare un numero se lo desidera, semplicemente sopprime la tastiera virtuale inizialmente. Utilizzare NumberPicker.setDescendantFocusability(FOCUS_BLOCK_DESCENDANTS) per sopprimere la tastiera software quando l'interfaccia viene visualizzata per la prima volta come sopra. Quindi ottieni la tua finestra di dialogo o attività per implementare View.OnTouchListener, chiama setOnTouchListener(this) sul tuo NumberPicker e nella tua implementazione di onTouch(View v,MotionEvent e) reimposta la focalizzazione dei discendenti di numberpicker al suo valore normale, quindi restituisci false.

Il ritorno false indica che il tocco è ancora elaborato da NumberPicker, il che significa che se l'utente tocca la casella di modifica, la tastiera virtuale viene visualizzata. Questo è esattamente ciò che volevo affrontare con lo stesso problema: avere la tastiera morbida con la finestra di dialogo quando è mostrata per la prima volta è sgradevole mentre sposta la finestra di dialogo dopo che appare.

public class GetBufferDialog extends DialogFragment implements View.OnTouchListener { 

dopo aver creato la finestra di dialogo nel metodo onCreateDialog() e trovando il NumberPicker:

m_oldFocus = m_numberpicker.getDescendantFocusability(); 
m_numberpicker.setDescendantFocusability(NumberPicker.FOCUS_BLOCK_DESCENDANTS); 
m_numberpicker.setOnTouchListener(this); 

ed ecco il metodo OnTouch:

public boolean onTouch(View v, MotionEvent event) { 
    m_numberpicker.setDescendantFocusability(m_oldFocus); 
    return false; 
} 
+0

solo questo mi ha aiutato a risolvere il mio problema, grazie per il tuo approccio – smoothumut

2

Il più semplice che ho trovato per lavoro è stato:

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

Grazie mille !!! Ho provato tutto senza risultato, ma questo funziona bene ... – Christian

0
/** 
* 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(); 
     } 
    } 
} 

* chiamando questo:

  • non bloccherà discendente focusability (numberpicker sarà modificabile)

  • sarà nascondere ingresso morbido creare

  • prima (ingresso elaborazione) getValue() consentirà di ottenere il valore corretto


47

versione XML della risposta di Andrew Webber

android:descendantFocusability="blocksDescendants" 

Esempio

<NumberPicker 
     android:id="@+id/your_numberpicker" 
     android:layout_width="wrap_content" 
     android:layout_height="wrap_content" 
     android:descendantFocusability="blocksDescendants"/> 
Problemi correlati