2010-07-24 16 views
7

Czy jest możliwe dołączenie do niego EditTextPreference z autouzupełnianiem?Możliwe autouzupełnianie EditTextPreference?

Znam ho, aby dołączyć do elementu o identyfikatorze, ale mam problem z tym, jak podłączyć ArrayAdapter do pola preferencji.

To jest złe, ale jest tak blisko, jak tylko mogę.

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

Odpowiedz

0

Prawdopodobnie jeśli podklasy go i na swój własny pogląd na to i użyć obiektu AutoCompleteTextView jako element będzie działał, jak obecnie nie widzę, w jaki sposób prosty EditText można zmienić autouzupełniania.

8

Oto rozwiązanie, które zaimplementowałem, analizując kod źródłowy EditTextPreference.java.

Zasadniczo powinieneś podklasować EditTextPreference i przesłonić, gdy wiąże się z oknem dialogowym. W tym momencie możesz pobrać EditText, skopiować jego wartości i usunąć z jego rodzicielskiej grupy widoków. Następnie wstrzyknij swój Autocompletetextview i podłącz go do 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

Wydawało mi się, że musi być „łatwiejsza” droga do osiągnięcia tego celu niż włamanie do klasy EditTextPreference i brudząc z widoku. Oto moje rozwiązanie, ponieważ AutoCompleteTextView rozszerza EditText, musiałem tylko zastąpić metody EditTextPreference, które bezpośrednio wywołują stały obiekt EditText.

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

Dzięki Brady za połączenie ze źródłem.

+0

Prawie! Pojawi się okno z autouzupełnianiem, ale pole rozwijane autouzupełnianie jest wyłączone i pokazuje się nad polem wprowadzania, a dolna połowa listy rozwijanej nie jest wyświetlana. –

+0

Właściwie udało mi się naprawić mój błąd z poprzedniego komentarza poprzez zakodowanie wartości dla rozwijanej wysokości skrzynki. –