Is it possible to have an EditTextPreference with AutoComplete attached to it?
I know ho to attach one to an element with an id, but am having trouble figure out how to attach the ArrayAdapter to the preference field.
This is wrong, but it's as close as I can get.
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);
It seemed to me there had to be an "easier" way to accomplish this than by hacking into the EditTextPreference class and messing with the view. Here's my solution, since AutoCompleteTextView extends EditText, I only had to override the EditTextPreference methods that call their constant EditText object directly.
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);
}
}
}
}
Thanks to Brady for linking to the source.
Here's a workaround I implemented by studying the EditTextPreference.java source code.
Essentially you need to subclass EditTextPreference and override when it binds to the dialog. At this point you can retrieve the EditText, copy it's values, and remove it from its parent view group. Then you inject your Autocompletetextview and hook up it's 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";
}
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With