Android requestFocus()的问题

时间:2010-10-08 11:46:55

标签: android android-edittext

下面是我编写的用于将焦点从一个编辑文本转移到另一个编辑文本的代码段,但是我在这个实现中遇到的问题是,焦点转移到特定的编辑文本,然后突然移动到接下来编辑文本。所以,我无法输入任何内容,因为焦点完全没有保留特定的编辑文本..

 
//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

感谢任何帮助。

提前致谢。

4 个答案:

答案 0 :(得分:2)

我意识到这是一个老问题,但我面临着类似的问题。经过几个小时的挫折之后,我发现了这个问题,所以我想我应该把它发布在这里以防其他人需要它。

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

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

答案 1 :(得分:1)

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

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

你的第一个可能无法识别的问题是,EditorActionListener被调用两次。一次用于按键,一次用于按下。我不知道你检查actionId的效果,所以可能会保护你的代码不被执行两次。

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

所以我猜现在输入类型有效,因为如果EditText处于多线模式,输入键将不会进一步发送焦点。

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

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方法可以处理上下两种情况。

答案 2 :(得分:0)

Android始终支持将“上/下/右/左”层次结构编码为视图。这最初是为像G1这样的轨迹球设备完成的。我不认为你发现了一个错误 - 但我们可以通过查看一些SDK源来验证。对于遇到类似问题的人,您可以尝试在需要“模糊”的视图上调用setNext ** Focus(...),然后生成一个事件以移动到“下一个字段向下”。这可以在XML和运行时完成。你们有没有试过这个?

参见View#focusSearch(int)和View #setNext ** Focus(int)。 SDK建议在你的onEditorAction(...)中你可以编写类似的东西:

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

答案 3 :(得分:0)

我发现这个工作可靠:

        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分支,我在这里省略了,因为它们不是问题的一部分。