6

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

问题 因为我要格式化(即修改)他的输入,我需要知道他何时完成(所以我的格式化不会干扰他正在进行的输入)。

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

在此之后,我尝试弄乱按钮的焦点,将其设置为 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;
                }
            }
        }
    };
}

然而问题是,上面的 OnFocusChangelistener 只有在我的 EditText 失去焦点时才会被调用,但是当我点击 Activity 中的按钮时它不会失去焦点,并且如上所述,将 Button 的 isFocusableInTouchMode 设置为 true 是不可行的,因为它需要每次点击两次才能触发。

4

4 回答 4

10

我做了一些研究,除此之外,我发现了这个线程。它详细说明了您遇到的类似问题(按钮没有获得焦点)。请尝试以下操作:在您的按钮上,设置 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
        }
    };

但他们可能应该只修复按钮的焦点问题,当前的行为确实会导致一些问题(比如你的问题)。

于 2011-12-29T12:10:43.183 回答
0

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

于 2011-12-29T10:12:44.293 回答
0

你遇到了什么问题?需要包含setOnFocusChangeListener在 ureditfield中。只是检查一下。并且必须覆盖 onFocusChange。

请检查...

在此处输入链接描述

于 2011-12-29T10:13:05.010 回答
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
    });
于 2012-10-12T13:02:36.143 回答