Android: оцените EditText после того, как пользователь закончит редактирование - PullRequest
4 голосов
/ 29 декабря 2011

Что я хочу У меня есть 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 get вызывается, только если мой EditText теряет фокус, но он НЕ теряет фокус, когда я нажимаюна кнопке в моей Деятельности, и, как указано выше, невозможно установить isFocusableInTouchMode для кнопки в значение true, так как для этого нужно дважды щелкнуть каждый раз для запуска.

Ответы [ 4 ]

9 голосов
/ 29 декабря 2011

Я провел некоторое исследование и среди прочего нашел эту ветку.Это развивает похожую проблему, которая у вас возникла (кнопка не фокусируется).Попробуйте сделать следующее: На ваших кнопках установите 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
        }
    };

Но онивероятно, следует просто исправить фокусировку для кнопок, текущее поведение действительно вызывает некоторые проблемы (например, ваше).

0 голосов
/ 12 октября 2012

Да, определенно есть проблема с редактируемым текстом, который не теряет фокус после получения.После недолгих поисков я обнаружил, что достичь желаемого результата можно только обходным путем.У меня было подобное требование, и я сделал обходной путь для выполнения вышеупомянутой задачи, и он прекрасно работает для меня.Обходной путь заключается в следующем:Установите onClickListener для editText и в событии onClick установите флаг, сообщающий, что был нажат editText.Установите onKeyListener для editText и получите текущее значение editText в событии onKey.Теперь, скажем, вы нажали кнопку «Готово / Назад» в вашей активности / диалоге.Здесь вы можете проверить флаги, которые были установлены при нажатии 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
    });
0 голосов
/ 29 декабря 2011

в чем проблема, которую ты получаешь? нужно включить setOnFocusChangeListener с ур editfield. просто проверь это. и должны переопределить onFocusChange.

Пожалуйста, проверьте это ...

здесь введите описание ссылки здесь

0 голосов
/ 29 декабря 2011

Попробуйте использовать как View.setFocusableInTouchMode(), так и View.requestFocus().Вы можете использовать интерфейс onKeyListener() для обнаружения ввода пользователя и запуска таймера после каждого события onKey, чтобы начать редактирование после разумной задержки.

...