7

オートコンプリートがアタッチされたEditTextPreferenceを持つことは可能ですか?

IDを持つ要素に1つをアタッチする方法は知っていますが、ArrayAdapterを設定フィールドにアタッチする方法を理解するのに問題があります。

これは間違っていますが、私が得ることができる限り近いです。

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

3 に答える 3

8

EditTextPreference.javaソースコードを調べて実装した回避策を次に示します。

基本的に、EditTextPreferenceをサブクラス化し、ダイアログにバインドするときにオーバーライドする必要があります。この時点で、EditTextを取得し、その値をコピーして、親ビューグループから削除できます。次に、Autocompletetextviewを挿入し、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";
}
于 2010-11-29T23:36:55.707 に答える
8

EditTextPreferenceクラスにハッキングしてビューをいじるよりも、これを達成するための「より簡単な」方法が必要であるように私には思えました。AutoCompleteTextViewはEditTextを拡張するため、これが私の解決策です。定数EditTextオブジェクトを直接呼び出すEditTextPreferenceメソッドをオーバーライドするだけで済みました。

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

ソースにリンクしてくれたBradyに感謝します。

于 2011-05-23T02:40:29.990 に答える
0

おそらく、サブクラス化して独自のビューを作成し、AutoCompleteTextViewオブジェクトを要素として使用すると、現在、単純なEditTextをオートコンプリートに変更する方法がわかりません。

于 2010-07-27T14:12:47.197 に答える