2010-07-24 8 views
7

Est-il possible d'avoir un objet EditTextPreference avec saisie semi-automatique joint?Possibilité d'auto-complétion d'une directive EditTextPreference?

Je sais ho pour attacher un à un élément avec un ID, mais j'ai du mal à comprendre comment attacher l'ArrayAdapter au champ de préférence.

C'est faux, mais c'est aussi proche que possible.

final String[] TEAMS = getResources().getStringArray(R.array.teams); 
AutoCompleteTextView EditTextPreference = (AutoCompleteTextView) findViewById(R.id.editTextPrefTeam);  
ArrayAdapter adapter = new ArrayAdapter(this, android.R.layout.simple_dropdown_item_1line, TEAMS); 
EditTextPreference.setAdapter(adapter); 

Répondre

0

probablement si vous sous-classe et faites votre propre point de vue pour cela et utiliser l'objet AutoCompleteTextView comme élément, il fonctionnera, comme actuellement, je ne vois pas comment un simple EditText peut être changé en autocomplete.

8

Voici une solution de contournement que j'ai implémentée en étudiant le code source EditTextPreference.java.

Essentiellement, vous devez sous-classer EditTextPreference et remplacer quand il se lie à la boîte de dialogue. À ce stade, vous pouvez récupérer l'EditText, copier ses valeurs et le supprimer de son groupe de vues parent. Ensuite, vous injectez votre Autocompletetextview et raccordez l'Arrayadapter.

public class AutoCompleteEditTextPreference extends EditTextPreference 
{ 
    public AutoCompleteEditTextPreference(Context context) 
    { 
     super(context); 
    } 

    public AutoCompleteEditTextPreference(Context context, AttributeSet attrs) 
    { 
     super(context, attrs); 
    } 

    public AutoCompleteEditTextPreference(Context context, AttributeSet attrs, 
     int defStyle) 
    { 
     super(context, attrs, defStyle); 
    }  

    /** 
    * the default EditTextPreference does not make it easy to 
    * use an AutoCompleteEditTextPreference field. By overriding this method 
    * we perform surgery on it to use the type of edit field that 
    * we want. 
    */ 
    protected void onBindDialogView(View view) 
    { 
     super.onBindDialogView(view); 

     // find the current EditText object 
     final EditText editText = (EditText)view.findViewById(android.R.id.edit); 
     // copy its layout params 
     LayoutParams params = editText.getLayoutParams(); 
     ViewGroup vg = (ViewGroup)editText.getParent(); 
     String curVal = editText.getText().toString(); 
     // remove it from the existing layout hierarchy 
     vg.removeView(editText);   
     // construct a new editable autocomplete object with the appropriate params 
     // and id that the TextEditPreference is expecting 
     mACTV = new AutoCompleteTextView(getContext()); 
     mACTV.setLayoutParams(params); 
     mACTV.setId(android.R.id.edit); 
     mACTV.setText(curVal); 


     ArrayAdapter<String> adapter = new ArrayAdapter<String>(getContext(), 
      android.R.layout.simple_dropdown_item_1line, [LIST OF DATA HERE]); 
     mACTV.setAdapter(adapter); 

     // add the new view to the layout 
     vg.addView(mACTV); 
    } 

    /** 
    * Because the baseclass does not handle this correctly 
    * we need to query our injected AutoCompleteTextView for 
    * the value to save 
    */ 
    protected void onDialogClosed(boolean positiveResult) 
    { 
     super.onDialogClosed(positiveResult); 

     if (positiveResult && mACTV != null) 
     {   
      String value = mACTV.getText().toString(); 
      if (callChangeListener(value)) { 
       setText(value); 
      } 
     } 
    } 

    /** 
    * again we need to override methods from the base class 
    */ 
    public EditText getEditText() 
    { 
     return mACTV; 
    } 

    private AutoCompleteTextView mACTV = null; 
    private final String TAG = "AutoCompleteEditTextPreference"; 
} 
8

Il me semblait qu'il devait y avoir un « plus facile » façon d'y parvenir que par le piratage dans la classe EditTextPreference et de jouer avec la vue. Voici ma solution, puisque AutoCompleteTextView étend EditText, je devais seulement remplacer les méthodes EditTextPreference qui appellent leur objet EditText constant directement.

public class AutoCompletePreference extends EditTextPreference { 

private static AutoCompleteTextView mEditText = null; 

public AutoCompletePreference(Context context, AttributeSet attrs) { 
    super(context, attrs); 
    mEditText = new AutoCompleteTextView(context, attrs); 
    mEditText.setThreshold(0); 
    //The adapter of your choice 
    ArrayAdapter<String> adapter = new ArrayAdapter<String>(context, android.R.layout.simple_dropdown_item_1line, COUNTRIES); 
    mEditText.setAdapter(adapter); 
} 
private static final String[] COUNTRIES = new String[] { 
    "Belgium", "France", "Italy", "Germany", "Spain" 
}; 

@Override 
protected void onBindDialogView(View view) { 
    AutoCompleteTextView editText = mEditText; 
    editText.setText(getText()); 

    ViewParent oldParent = editText.getParent(); 
    if (oldParent != view) { 
     if (oldParent != null) { 
      ((ViewGroup) oldParent).removeView(editText); 
     } 
     onAddEditTextToDialogView(view, editText); 
    } 
} 

@Override 
protected void onDialogClosed(boolean positiveResult) { 
    if (positiveResult) { 
     String value = mEditText.getText().toString(); 
     if (callChangeListener(value)) { 
      setText(value); 
     } 
    } 
} 
} 

Merci à Brady pour le lien vers la source.

+0

Presque! Je fais apparaître ma boîte automatique complète, mais la liste déroulante auto complète est coupée et s'affiche au-dessus du champ de saisie, la moitié inférieure de la liste déroulante ne s'affichant pas. –

+0

En fait, j'ai été en mesure de corriger mon bug du commentaire précédent en codant en dur une valeur pour la hauteur de la boîte déroulante. –