【问题标题】:problem with Android requestFocus()Android requestFocus() 的问题
【发布时间】:2011-04-22 20:29:38
【问题描述】:

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

//这里有一些代码 // gun_pistolNotes 和 gun_pistolModel 是两个差异。编辑文本 …… …… gun_pistolNotes.setOnEditorActionListener(new OnEditorActionListener(){ @覆盖 公共布尔 onEditorAction(TextView 视图,int actionId,KeyEvent 事件){ 如果(actionId == EditorInfo.IME_ACTION_UNSPECIFIED){ gun_pistolModel.requestFocus(); // 移动到这个edittext并突然移动到另一个edittext 返回真; } 返回假; } }); …… …… //这里有一些代码

感谢任何帮助。

提前致谢。

【问题讨论】:

    标签: android android-edittext


    【解决方案1】:

    我意识到这是一个老问题,但我遇到了类似的问题,经过数小时的挫败后,我发现了问题,所以我只是想我应该把它贴在这里以防其他人需要它。

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

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

    【讨论】:

    • 谢谢,伙计,我在 Android 4.1 上遇到了同样的问题。删除 inputType 后一切正常。
    【解决方案2】:

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

    我决定分析视图内部发生了什么。毕竟我可以说这不是一个错误,只是一个不愉快的星座也许:)。您请求焦点的 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 方法同时处理上下。

    【讨论】:

      【解决方案3】:

      我发现这很可靠:

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

      【讨论】:

        【解决方案4】:

        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); } ...

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2019-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2014-08-28
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多