答案 0 :(得分: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";
}
答案 1 :(得分: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链接到源。
答案 2 :(得分:0)
可能如果你将它子类化并为此创建自己的视图并使用AutoCompleteTextView对象作为元素它将起作用,因为目前我没有看到如何将简单的EditText更改为自动完成。