【问题标题】:Request focus from an edittext to another with a different inputType使用不同的 inputType 从一个edittext请求焦点到另一个
【发布时间】:2012-09-20 14:24:23
【问题描述】:

我必须像这些不同的 EditText :

  • EditText1 的 inputType 为“textCapWords”
  • EditText2 的 inputType 为“数字”

当我启动我的活动时,我立即请求关注 EditText1。这样做的唯一方法是将其添加到 onCreate :

getWindow().setSoftInputMode(
WindowManager.LayoutParams.SOFT_INPUT_STATE_ALWAYS_VISIBLE);
EDITTEXT1.requestFocus();

当用户在他的软键盘上单击“返回”时,我希望 EDITTEXT2 获得焦点。所以我添加了这个:

EDITTEXT1.setOnKeyListener(new OnKeyListener() {
    public boolean onKey(View v, int keyCode, KeyEvent event) {
        if (keyCode == 66) { // CODE FOR RETURN
            EDITTEXT2.requestFocus();
        }
        return false;
    }
});

但是当我这样做时,什么都没有发生。我所有的 EditText 都设置了 FocusableInTouchMode 和 Focusable :

<EditText
    android:id="@+id/EDITTEXT1"
    android:layout_width="0dip"
    android:layout_height="20dip"
    android:layout_weight="2"
    android:background="@color/White"
    android:ems="10"
    android:hint="My First EditText"
    android:inputType="textCapWords"
    android:padding="2dip"
    android:singleLine="true"
    android:textColor="@color/Black"
    android:textSize="12dip" >
    <requestFocus />
</EditText>

<EditText
    android:id="@+id/EDITTEXT2"
    android:layout_width="0dip"
    android:layout_height="20dip"
    android:layout_weight="2"
    android:background="@color/White"
    android:ems="10"
    android:hint="My Second EditText"
    android:inputType="textCapWords"
    android:padding="2dip"
    android:singleLine="true"
    android:textColor="@color/Black"
    android:textSize="12dip" >
</EditText>

您对在 EDITTEXT1 上按 OK 后如何聚焦 EDITTEXT2 有任何想法吗?

提前致谢!

【问题讨论】:

    标签: android focus


    【解决方案1】:

    非常感谢您的回答。我终于找到了回答我自己问题的最简单方法:

    添加:

    android:nextFocusRight="@+id/EDITTEXT2"

    到 EDITTEXT1 的属性。

    在 EDITTEXT1 上单击“Enter”后,无需任何其他操作即可转到 EDITTEXT2。

    【讨论】:

      【解决方案2】:

      您应该首先创建自己的 EditText,它从 EditText 扩展而来,然后像这样覆盖 dispatchKeyEventPreIme 方法:

      @Override
      public boolean dispatchKeyEventPreIme(KeyEvent event) {  
          if (event.getKeyCode() == KeyEvent.KEYCODE_BACK) {  
              if (event.getAction() == KeyEvent.ACTION_DOWN && event.getRepeatCount() == 0) {  
                  return super.dispatchKeyEventPreIme(event);  
              } else if (event.getAction() == KeyEvent.ACTION_UP) {  
                  hideInputMethod();
                  //change your focus at here
                  return true;  
              }  
          }  
          return super.dispatchKeyEventPreIme(event);  
      }
      
      protected void hideInputMethod() {  
          InputMethodManager imm = (InputMethodManager)getContext()  
              .getSystemService(Context.INPUT_METHOD_SERVICE);  
          if (null != imm) {  
              imm.hideSoftInputFromWindow(getWindowToken(), 0);  
          }  
      }
      

      顺便说一句,if (keyCode == 66) { // CODE FOR RETURN这样的编码方式不太好,而且66不是back的值,是回车键。

      public static final int KEYCODE_ENTER           = 66;
      

      你最好改写KeyEvent.KEYCODE_BACKKeyEvent.KEYCODE_ENTER

      希望对你有帮助。

      【讨论】:

        猜你喜欢
        • 2019-07-08
        • 1970-01-01
        • 2011-12-26
        • 1970-01-01
        • 2013-07-09
        • 2015-01-10
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多