知道何时完成编辑文本


74

我怎么知道何时编辑完编辑文本?就像用户选择下一个框或按下软键盘上的完成按钮时一样。

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

谢谢

Answers:


107

通过使用这样的东西

 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,但是似乎没有任何作用...如果我无法集中注意力,它将把动作传递给焦点变更监听器。
马特

1
@Matt:我认为问题是按钮没有抓住焦点?我实现了一个例程,在该例程中,按钮将有意识地抓住点击焦点(我认为该方法称为requestFocus)。因为如果按钮抓住焦点,您的文本字段就会丢失它,一切都会好起来的。
AgentKnopf

如果在edittext中编辑文本后用户按下back而不是softinput中的done按钮。那会怎样 在那种情况下,yourcalc()方法是否调用?
Brijesh Patel

手动将焦点切换到其他视图时,这还会捕获事件吗?
mr5

1
您还可以处理以下操作:EditorInfo.IME_ACTION_NEXTIME_ACTION_PREVIOUS。我只是通过将答案添加到代码中来编辑答案
Kostanos '19

42

EditText继承setOnFocusChangeListener需要的实现OnFocusChangeListener

实现,onFocusChange并有一个布尔参数hasFocus。如果这是错误的,则您将注意力转移到另一个控件上。

编辑

要处理这两种情况-编辑失去焦点的文本或用户单击“完成”按钮-创建从两个侦听器调用的单个方法。

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

好的,那行得通,但仅当用户单击其他内容时才行。有没有办法检测用户何时按下完成键?编辑:或当用户按下完成时取消对焦。
马特

1
是的 只需让EditText的OnFocusChangeListener和Button的OnClickListener调用同一计算方法即可。我编辑了答案以包含此代码。^
Rich

将android:imeOptions =“ actionNext”添加到txtEdit的xml中时,在我的三星Galaxy上按下软键NextKey时,它失去了焦点。添加“txtEdit.setOnKeyListener(新OnKeyListener(){”来的onCreate()做不来的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)当用户单击软键盘上的“完成”按钮(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);
            }
        }
    });

这对我有用。使用以下代码进行计算后,您可以隐藏软键盘:

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

编辑:将返回值添加到onEditorAction


3

当焦点从编辑文本转移到文本时,我已经做了一件简单的事情。如果用户将焦点转移到选择其他视图(例如按钮或其他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();
             }
        }
    });

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.