Android:用户完成编辑后评估EditText

时间:2011-12-29 10:05:05

标签: android button android-edittext textwatcher

我想要什么 我有一个EditText,用户可以在其中输入一个值,例如10.40。一旦用户完成编辑,我将其输入格式化为货币,例如上面提到的值将格式化为$ 10.40(在Locale.US的情况下)。我将该结果显示在用户之前编辑过的相同EditText中。

问题 因为我要格式化(即修改)他的输入,我需要知道他什么时候完成(因此我的格式不会干扰他的持续输入)。

我尝试了什么 TextWatcher不是一个选项,因为它会在每次编辑时触发,因此当用户输入一个,零,四个,点和零(= 10.40)时。我目前正在使用OnFocusChangeListener,它可以正常工作,但问题是:我的应用程序中有按钮,如果用户在编辑EditText后单击按钮,EditText将不会丢失Focus,因此我的格式化代码永远不会被调用。 ..

在此之后,我尝试弄乱按钮的焦点,将其设置为FocusableInTouchMode - 这导致按钮必须被点击两次才能触发(这是不行),因为它第一次获得焦点并得到了第二次激活。经过这么多的黑客攻击后,我想知道是否有人知道如何解决这个难题。

部分代码

我将以下OnFocusChangeListener添加到我的EditText,其功能如上所述。 EditText封装在CurrencyTextbox中(实际上并不相关):

@Override
protected OnFocusChangeListener getOnFocusChangeListener() {
    return new OnFocusChangeListener() {
        @Override
        public void onFocusChange(View v, boolean hasFocus) {
            if (hasFocus) {
                //Member variable in the class which contains an EditText
                CurrencyTextbox.this.hadFocus = true;
            } else {
                // Thes EditText has lost focus
                Log.v(TAG, "Lost focus.");
                if (CurrencyTextbox.this.hadFocus) {
                    // We previously had focus, now we lost it, format the user input!
                    // Get current value of the Textbox
                    String value = CurrencyTextbox.this.textbox.getText().toString();
                    // Formatting the user input
                    value = String.format(//Doing some formatting);
                    // Reset the had focus
                    CurrencyTextbox.this.hadFocus = false;
                }
            }
        }
    };
}

问题是,如果我的EditText失去焦点,上面的OnFocusChangelistener只会被调用,但是当我单击Activity中的按钮时它不会失去焦点,如上所述,设置Button的isFocusableInTouchMode是不可行的为真,因为每次点击都需要点击两次。

4 个答案:

答案 0 :(得分:9)

我做了一些研究,其中包括this线程。它详细阐述了你所拥有的类似问题(按钮无法获得焦点)。尝试以下操作:在您的按钮上,设置setFocusable(true)(不是setFocusableInTouchMode!因为这会产生您在OP中声明的烦人行为),然后在按钮上设置以下OnClickListener:

    return new View.OnClickListener() {

        @Override
        public void onClick(View v) {
            // TODO workaround because of android issue nr. 2705
            button.requestFocusFromTouch();
            // Do some stuff to handle OnClick
        }
    };

但他们应该只是修复按钮的焦点内容,目前的行为确实会引起一些问题(比如你的)。

答案 1 :(得分:0)

尝试同时使用View.setFocusableInTouchMode()View.requestFocus()。您可以使用onKeyListener()界面检测用户输入并在每个onKey事件后启动计时器,以便在合理延迟后开始编辑。

答案 2 :(得分:0)

你得到的问题是什么?需要在setOnFocusChangeListener中加入editfield。检查一下。并且必须覆盖onFocusChange。

检查那个......

这里enter link description here

答案 3 :(得分:0)

是的,编辑文本一旦出现问题就不会失去焦点。经过相当多的谷歌搜索后,我发现仅通过解决方法就可以达到预期的效果。
我有类似的要求,我做了一个解决方法来完成上述任务,它对我很有用。
解决方法如下:
为editText设置onClickListener,并在onClick事件中设置一个标记单击editText的标志。
为editText设置onKeyListener并获取onKey事件中editText的当前值。
现在,假设您已在活动/对话框中单击了完成/后退按钮。在这里,您可以检查单击editText时设置的标志。所以,如果它真的让任何程序调用你想要的。

EditText v = (EditText) layout.findViewById(R.id.framerate);
v.setOnClickListener(new OnClickListener() {
    public void onClick(View v) {
        Log.d(ExploreUIActivity.TAG, "Insided onClick");
        vClicked= true;
    }
});
v.setOnKeyListener(new OnKeyListener() {
    public boolean onKey(View v, int keyCode, KeyEvent event) {
        Log.d(ExploreUIActivity.TAG, "Inside onKeyListener");
        value = ((EditText) v).getText().toString();
        return false;
    }
});


现在为后退/完成按钮设置onClickListener并检查标志是否已设置

back.setOnClickListener(new OnClickListener() {
    public onClick(View v) {
        //check the flag
        //if set do some stuff
    });