我有一个带有几个LinearLayout
的EditText
,所有这些都是以编程方式创建的(不是使用XML布局),特别是没有ID。
当我输入其中一个EditText
时,下一个(相应于焦点)被禁用,我按下键盘上的Next IME按钮,焦点前进到禁用的EditText
,但我无法输入任何内容它。
我期待的是专注于进入下一个启用的EditText
。我还试过,除了通过EditText
禁用edittext.setEnabled(false)
,通过edittext.setFocusable(false)
和edittext.setFocusableInTouchMode(false)
禁用其可聚焦性,并设置TYPE_NULL
输入类型,但无济于事。
任何提示?
谢谢 ;)
通过检查this blog post和子类化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;
}
}
更多细节:
ViewGroup
执行focusSearch()
使用FocusFinder,调用addFocusables()
。 ViewGroup
的实现测试可见性,而View
实现测试可聚焦性。既没有测试启用状态,这就是为什么我将此测试添加到上面的MyEditText
。
我解决了它将focusable属性设置为false,而不仅仅是enabled属性:
editText.setEnabled(false);
editText.setFocusable(false);
看到
EditText editText = (EditText) findViewById(R.id.search);
editText.setOnEditorActionListener(new OnEditorActionListener() {
@Override
public boolean onEditorAction(TextView v, int actionId, KeyEvent event) {
boolean handled = false;
if (actionId == EditorInfo.IME_ACTION_SEND) {
sendMessage();
handled = true;
}
return handled;
}
});
这是从http://developer.android.com/training/keyboard-input/style.html#Action抓住的。
如果你可以弄清楚如何专注于下一个TextView
,你可以为每个OnEditorActionListener
添加一个TextView
,如果它被禁用,它会将焦点传递给下一个。