I have a LinearLayout
with several EditText
's, all of them created programmatically (not with an XML layout), and in particular without IDs.
When I'm typing in one of the EditText
's, and the next one (respective to focus) is disabled, and I press the Next IME button on the keyboard, the focus advances to the disabled EditText
, but I can't type anything in it.
What I was expecting was focus to advance to the next enabled EditText
. I also tried, in addition to making the EditText
disabled via edittext.setEnabled(false)
, to disable its focusability via edittext.setFocusable(false)
and edittext.setFocusableInTouchMode(false)
, and to set a TYPE_NULL
input type, but to no avail.
Any hints?
Thanks ;)
Solved by examining how the next focusable is found by the keyboard from this blog post and by subclassing EditText
:
import android.content.Context;
import android.util.AttributeSet;
import android.view.View;
import android.widget.EditText;
public class MyEditText extends EditText {
public MyEditText(Context context, AttributeSet attrs, int defStyle) {
super(context, attrs, defStyle);
}
public MyEditText(Context context, AttributeSet attrs) {
super(context, attrs);
}
public MyEditText(Context context) {
super(context);
}
@Override
public View focusSearch(int direction) {
View v = super.focusSearch(direction);
if (v != null) {
if (v.isEnabled()) {
return v;
} else {
// keep searching
return v.focusSearch(direction);
}
}
return v;
}
}
More details:
ViewGroup
implementation of focusSearch()
uses a FocusFinder, which invokes addFocusables()
. The ViewGroup
's implementation tests for visibility, while the View
implementation tests for focusability. Neither test for the enabled state, which is why I added this test to MyEditText
above.