【问题标题】:Stuck with handling Enter in android edittext在 android edittext 中处理 Enter 卡住了
【发布时间】:2014-01-16 21:02:58
【问题描述】:

我有多个文本框。它们每个都附加了一个 TextWatcher。现在我想为最后一个强制文本框设置一个 OnKeyListener,这样我就可以处理 Enter 键。当在这个文本框中按下回车键时,我想将此文本框的文本设置为默认值,然后我想保存所有文本框中的数据,清除所有文本框并将焦点设置为第一个文本框,以便用户可以输入新数据。但是,显然我无法有效地请求关注 TextBox.OnKeyListener 的 onKey-eventhandler 中的任何其他 TextBox 或 Button。

myLastTextBox.setOnKeyListener( new EditText.OnKeyListener() {  
    @Override
    public boolean onKey(View arg0, int arg1, KeyEvent event) {
        if (event!= null && event.getKeyCode() == KeyEvent.KEYCODE_ENTER && event.getAction() == KeyEvent.ACTION_DOWN){
            Button  nextB = (Button) findViewById(R.id.myBtn);
            nextB.performClick(); //the function called validates all fields, 
                                  //saves the data to lists, sets all editText 
                                  //to "", requests focus to the first editText.                
            res= true;
        }
        else if (event!= null && event.getKeyCode() == KeyEvent.KEYCODE_ENTER &&  event.getAction() == KeyEvent.ACTION_UP) {
            res=true; //consume also the keyUp event of the enter key.
        }
        return res;
    }
});

当程序从 onKey 事件处理程序返回时,焦点仍然在同一个文本框中。任何帮助表示赞赏。

编辑: 好的,我想简化问题,但也许我让它太容易了。按下 Enter 后,我不仅要设置焦点,而且要调用一个函数,读取、保存、清除所有文本框,然后将焦点设置到第一个 editText。

【问题讨论】:

  • 您是否尝试过在 XML 布局中设置下一个焦点键?我认为它可能会做你正在尝试的开箱即用
  • 谢谢,试过了,但在这种情况下不起作用。

标签: android event-handling android-edittext


【解决方案1】:

因此,您应该研究 IME 操作。假设您有一个包含三个 EditText 视图的布局:

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
              android:orientation="vertical"
              android:layout_width="match_parent"
              android:layout_height="match_parent">

    <EditText
        android:id="@+id/username"
        android:hint="@string/username_hint"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:nextFocusDown="@+id/password"
        android:imeOptions="actionNext" />

    <EditText
        android:id="@+id/password"
        android:hint="@string/password_hint"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:nextFocusDown="@+id/confirm_password"
        android:inputType="text|textPassword"
        android:imeOptions="actionNext" />

    <EditText
        android:id="@+id/confirm_password"
        android:hint="@string/confirm_password_hint"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:inputType="text|textPassword"
        android:imeOptions="actionGo" />

</LinearLayout>

它会自动处理字段之间的移动,并为您提供“下一步”按钮,而不是回车键(对于标准输入法)。

现在,截取最后一个键(将是“Go”):

final EditText username = (EditText) findViewById(R.id.username);
final EditText password = (EditText) findViewById(R.id.password);
final EditText confirm = (EditText) findViewById(R.id.confirm_password);

confirm.setOnEditorActionListener(new TextView.OnEditorActionListener() {
    @Override
    public boolean onEditorAction(TextView v, int actionId, KeyEvent event) {
        if (EditorInfo.IME_ACTION_GO == actionId) {
            String un = username.getText().toString();
            String pass = password.getText().toString();
            String conf = confirm.getText().toString();

            username.setText(null);
            password.setText(null);
            confirm.setText(null);

            /* Save your stuff */
            // ...

            username.requestFocus();
            return true;
        } else {
            return false;
        }
    }
});

【讨论】:

  • 非常感谢。我将对 IME 操作进行更深入的研究,并将在晚上尝试一下。如果有人能指出什么概念会阻止将焦点设置到 onKeyListener 的 onKey 事件中的另一个元素,我会很高兴。
  • 非常感谢,这解决了我的问题,甚至 Enter 按钮的文本也变得更具可读性。
猜你喜欢
  • 2010-12-02
  • 2016-03-09
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2010-12-29
  • 2016-10-22
  • 2013-12-26
  • 1970-01-01
相关资源
最近更新 更多