知道何时编辑文本已完成

77

如何知道我的编辑文本何时完成编辑?例如当用户选择下一个框或按软键盘上的完成按钮时。

我想知道这一点,以便我可以夹紧输入。看起来文本监视器的afterTextChanged在每个字符输入后发生。我需要对输入进行一些计算,因此我想避免在每个字符输入后进行计算。

谢谢

5个回答

111

通过使用这样的东西

 meditText.setOnEditorActionListener(new TextView.OnEditorActionListener() {
        @Override
        public boolean onEditorAction(TextView v, int actionId, KeyEvent event) {
            switch (actionId){
                case EditorInfo.IME_ACTION_DONE:
                case EditorInfo.IME_ACTION_NEXT:
                case EditorInfo.IME_ACTION_PREVIOUS:
                    yourcalc();
                    return true;
            }
            return false;
        }
    });

好的,你和Rich的回答似乎是我需要的,谢谢。有没有办法在用户使用这种方法完成时取消editText的焦点?我尝试过v.clearfocus,但那似乎没有任何作用...如果我能取消焦点,它就会将操作传递给on focus change监听器。 - Matt
1
@Matt:我认为问题在于按钮没有抓取焦点?我实现了一个例程,在单击时按钮会故意抓取焦点(我认为该方法称为requestFocus)。因为如果按钮抓取焦点,您的文本字段将失去焦点,一切都会好起来。 - AgentKnopf
如果在EditText中编辑文本后,用户按下返回键而不是软输入法中的完成按钮,那么会发生什么?在这种情况下,yourcalc()方法是否被调用? - Brijesh Patel
这个代码也能捕获手动切换到其他视图时的事件吗? - mr5
2
你还可以处理像 EditorInfo.IME_ACTION_NEXTIME_ACTION_PREVIOUS 这样的操作。我刚刚编辑了答案,将它们添加到了代码中。 - Kostanos

43

EditText继承了setOnFocusChangeListener方法,该方法需要实现OnFocusChangeListener接口。

实现onFocusChange方法时,会有一个boolean类型的参数hasFocus。当hasFocus为false时,表示焦点转移到了其他控件上。

编辑

为了同时处理两种情况——编辑文本失去焦点或用户点击"完成"按钮——创建一个统一的方法,并且该方法可以从这两个监听器中调用。

    private void calculate() { ... }

    btnDone.setOnClickListener(new OnClickListener() {
        public void onClick(View v) {
            calculate();
        }
    });

    txtEdit.setOnFocusChangeListener(new OnFocusChangeListener() {          

        public void onFocusChange(View v, boolean hasFocus) {
            if(!hasFocus)
                calculate();
        }
    });

好的,这可以正常运行,但仅当用户单击其他内容时才有效。是否有一种方法来检测用户何时按下“完成”?编辑:或者当用户按下“完成”时取消焦点。 - Matt
1
是的。只需将EditText的OnFocusChangeListener和Button的OnClickListener调用相同的calculate方法即可。我编辑了我的答案,包括此代码。^ - Rich
将“android:imeOptions =“actionNext””添加到txtEdit的xml中,使得在我的三星Galaxy上按下软键盘的NextKey时,它失去了焦点。在onCreate()中添加“txtEdit.setOnKeyListener(new OnKeyListener(){”使得没有软键盘的模拟器响应EnterKey。 - earlcasper

15

使用像这样定义的EditText对象xml:

    <EditText
        android:id="@+id/create_survey_newquestion_editText_minvalue"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_alignParentRight="true"
        android:layout_centerVertical="true"
        android:ems="4"
        android:imeOptions="actionDone"
        android:inputType="number" />

我们可以在以下两种情况下捕获文本:i)当用户点击软键盘上的Done按钮(OnEditorActionListener)时,或ii)当EditText失去焦点(OnFocusChangeListener),现在在另一个EditText上:

    /**
     * 3. Set the min value EditText listener
     */
    editText= (EditText) this.viewGroup.findViewById(R.id.create_survey_newquestion_editText_minvalue);
    editText.setOnEditorActionListener(new OnEditorActionListener()
    {
        @Override
        public boolean onEditorAction(TextView v, int actionId, KeyEvent event)
        {
            String input;
            if(actionId == EditorInfo.IME_ACTION_DONE)
            {
                input= v.getText().toString();
                MyActivity.calculate(input);
                return true; // consume.
            }
            return false; // pass on to other listeners.
        }
    });
    editText.setOnFocusChangeListener(new View.OnFocusChangeListener()
    {
        @Override
        public void onFocusChange(View v, boolean hasFocus)
        {
            String input;
            EditText editText;

            if(!hasFocus)
            {
                editText= (EditText) v;
                input= editText.getText().toString();
                MyActivity.calculate(input);
            }
        }
    });

这个对我有用。你可以使用类似以下代码的方法,在计算完成后隐藏软键盘:

```java InputMethodManager imm = (InputMethodManager) getSystemService(Context.INPUT_METHOD_SERVICE); imm.hideSoftInputFromWindow(editText.getWindowToken(), 0); ```

private void hideKeyboard(EditText editText)
{
    InputMethodManager imm= (InputMethodManager) getSystemService(Context.INPUT_METHOD_SERVICE);
    imm.hideSoftInputFromWindow(editText.getWindowToken(), 0);
}

编辑:在onEditorAction中添加了返回值


5

我已经完成了这个简单的事情,当焦点从编辑文本移开时,获取文本。如果用户将焦点转移到其他视图(如按钮或其他EditText或任何视图),则此方法将起作用。

        editText.setOnFocusChangeListener(new View.OnFocusChangeListener() {
        @Override
        public void onFocusChange(View v, boolean hasFocus) {
            if (!hasFocus) {
                EditText editText = (EditText) v;
                String text = editText.getText().toString();
             }
        }
    });

0

11
TextWatcher仅告知文本何时改变,而不是焦点何时改变。 - Vlas Voloshin

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接