Android requestFocus()的问题

problem with Android requestFocus()

下面是我编写的用于将焦点从一个编辑文本转移到另一个编辑文本的代码,但是我在此实现中遇到的问题是,焦点移到了特定的编辑文本,然后突然移到了下一个编辑文本 .so,我无法输入任何内容,因为焦点根本没有停留在那个特定的编辑文本上。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
//some code comes here
// gun_pistolNotes and gun_pistolModel are two diff. editText
......
......
    gun_pistolNotes.setOnEditorActionListener(new OnEditorActionListener(){
    @Override
    public boolean onEditorAction(TextView view,int actionId, KeyEvent event){
    if(actionId == EditorInfo.IME_ACTION_UNSPECIFIED){
        gun_pistolModel.requestFocus(); // moves to this edittext and suddenly moves to another editext
        return true;
    }
    return false;
    }
  });

......
......
//some code comes here

任何帮助表示赞赏。

提前致谢。


我意识到这是一个古老的问题,但是我面临着类似的问题,经过数小时的挫折后,我发现了问题,所以我以为应该将其发布在这里,以防别人需要。

在我的代码中,我意识到由于某种原因,在我的edittext上指定android:inputype会导致这种"跳跃"行为。因此,如果我在XML中具有EditText1android:inputType="textCapSentences",则在将焦点移至下一个视图之前,在EditText1上调用requestFocus()会使其短暂突出显示。

我不确定这是否是Android中的错误,或者确实是我遗漏的其他错误。我尝试使用setInputType()以编程方式以及在代码的各个点内设置inputType的方法,但它对我不起作用。因此,现在我刚刚删除了inputType属性,并且requestFocus()可以正常工作。


我发现这可靠地工作:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
        field1Text.setOnEditorActionListener(new TextView.OnEditorActionListener() {
        @Override
        public boolean onEditorAction(TextView textView, int i, KeyEvent keyEvent) {
            if ((i == EditorInfo.IME_ACTION_UNSPECIFIED) && (keyEvent != null) &&
                    (keyEvent.getKeyCode() == KeyEvent.KEYCODE_ENTER)) {
                if (keyEvent.getAction() == KeyEvent.ACTION_DOWN) {
                    return true;
                }
                i = EditorInfo.IME_ACTION_DONE;
            }
            if (i == EditorInfo.IME_ACTION_DONE) {
                field2Text.requestFocus();
                return true;
            }
            return false;
        }
    });

这既可以处理键盘输入,也可以单击虚拟键盘中的操作按钮。奇怪的逻辑是因为我做了其他一些事情requestFocus分支,在这里我省略了它,因为它们不是问题的一部分。


我正面临着完全相同的问题。我可以确认Kre8的声明,即只有设置了特定的输入类型(在我的情况下为textNoSuggestion / singleLine),才会发生此行为。稍后我将解释为什么可能是这种情况。

我决定分析View内部的情况。毕竟我可以说这不是一个错误,只是一个不愉快的星座:)。您请求焦点的EditText正确接收它。

您第一个可能无法识别的问题是,两次调用EditorActionListener。一次用于向上键,一次用于向下键。我不知道您检查actionId的效果,因此可能会使您的代码无法执行两次。

所以我在解决方案请求中将错误焦点集中在ACTION_DOWN键事件上。 EditText正确接收到焦点,但是在即将到来的ACTION_UP事件上,焦点由新聚焦的EditText解释,但焦点立即发送回了先前发送的焦点EditText,因为它在下一次接收的焦点搜索中。

所以我想现在输入类型会起作用,因为如果EditText处于多行模式,则Enter键将不会进一步发送焦点。

我最终的工作解决方案如下所示:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
passwordEditText.setOnEditorActionListener(new OnEditorActionListener() {

  @Override
  public boolean onEditorAction(TextView v, int actionId, KeyEvent event) {
    if (event != null && event.getKeyCode() == KeyEvent.KEYCODE_ENTER && v == passwordEditText) {
      if (event.getAction() == KeyEvent.ACTION_UP) {
        if (userEditText.length() > 0 && passwordEditText.length() > 0) {
          login();
        }
        if (userEditText.length() == 0) {
          userEditText.requestFocus();
        }
      }
      return true;
    }
    return false;
  }
});

希望它也对您有用:)

编辑:我忘了指出,可以根据需要选择EditText的输入类型,因为onEditorAction方法可以同时处理上下两种情况。


Android一直内置支持对视图的"上/下/右/左"层次结构进行编码。最初是为G1等轨迹球设备完成的。我认为您没有发现错误-但我们可以通过查看一些SDK来源进行验证。对于面临类似问题的人们,您可以尝试在需要"模糊处理"的视图上调用setNext ** Focus(...),然后生成一个事件以移至"下一个向下的字段"。可以在XML中或在运行时完成。你们尝试过吗?

请参见View#focusSearch(int)和View#setNext **焦点(int)。 SDK建议您在onEditorAction(...)中编写以下内容:

...
如果(userEditText.length()== 0){
hostGameBtn.setNextFocusDownId(R.id.myUserEditTextViewID);
hostGameBtn.focusSearch(View.FOCUS_DOWN);
}
...