当一个EditText失去焦点时,如何防止另一个EditText获得焦点

3

在我的活动中,我有几个EditText。当我从其中一个EditText移除焦点并将其设为非可聚焦状态时,焦点会转移到另一个EditText上。我通过以下方式移除焦点:

atxtTag.setFocusable(false);
atxtTag.setFocusableInTouchMode(false);
atxtTag.clearFocus();

我不想将焦点转移到另一个EditText上。 我尝试通过在从第一个元素移除焦点后将焦点设置在另一个视图上来实现此目的。 因此,我将焦点放在了主布局上,该布局是一个ScrollView,但它没有起作用。

我如何实现在不将焦点转移到另一个EditText上的情况下删除一个EditText上的焦点?

谢谢。


您需要将焦点放在其他可聚焦的小部件上。ScrollView 不可聚焦。 - CommonsWare
2个回答

3
< p >该 clearFocus 方法的实现清除焦点通过将 refocus 参数的值设置为true来调用 clearFocusInternal 。这导致请求对第一个可聚焦元素的焦点。因此,可能的解决方案是通过反射调用 clearFocusInternal(true,false); ,但我没有实际检查过。

深入研究requestFocus 实现,我发现它检查根视图的 DescendantFocusability 。使用这个信息,我构建了一个工作解决方案:

ViewGroup rootView = (ViewGroup) atxtTag.getRootView();
int dfValue = rootView.getDescendantFocusability();
rootView.setDescendantFocusability(ViewGroup.FOCUS_BLOCK_DESCENDANTS);
atxtTag.clearFocus();
rootView.setDescendantFocusability(dfValue);

此外,清除焦点不会隐藏软件键盘,因此您可能需要将其隐藏:

InputMethodManager inputMethodManager = (InputMethodManager)getSystemService(Context.INPUT_METHOD_SERVICE);
inputMethodManager.hideSoftInputFromWindow(atxtTag.getWindowToken(), 0);

0
你可以更改清单文件:
android:focusable="false"
android:focusableInTouchMode="false"

如果我理解正确,在xml中每个EditText上都需要添加android:focusable="false" android:focusableInTouchMode="false"。是这样吗? - Marc-Antoine Charland
没错,这样应该可以防止EditText被聚焦。 - Ushal Naidoo

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接