Что не так с этим кодом поля EditTex? - PullRequest
1 голос
/ 27 июня 2011

Я ограничил значение в этом поле EditText цифрами и максимальной длиной 3

main.xml

    <EditText android:id="@+id/inputTime" android:layout_width="60sp"
    android:layout_height="wrap_content" android:text="@string/inputMaxTime"
    android:textSize="15sp" android:digits="0123456789" android:inputType="numberDecimal" 
    android:numeric="decimal" android:maxLength="3">
</EditText>

Я также программно ограничиваю значение 120, и это код:

        final EditText inputMinutes = (EditText) findViewById(R.id.inputTime);

    inputMinutes.setText(String.valueOf(preferences.getLong("neglectedPeriodMsecs", 60000)/60000));

    inputMinutes.addTextChangedListener(new TextWatcher()
    {
        public void onTextChanged(CharSequence s, int start, int before, int count)
        {

        }

        public void beforeTextChanged(CharSequence s, int start, int count, int after) 
        {

        }

        @Override
        public void afterTextChanged(Editable s) 
        {
            // TODO Auto-generated method stub
            if(isFreeVersion && Integer.valueOf(inputMinutes.getText().toString()) > 120)
                showToast("The free version is limited to 120 minutes.");
            else
            {
                editor.putLong("neglectedPeriodMsecs", Long.parseLong(s.toString())*60000);
                editor.commit();
            }
        }
    });

Я также попытался добавить еще одну проверку на

else if (Integer.valueOf(inputMinutes.getText().toString()) > 0)
            {
                editor.putLong("neglectedPeriodMsecs", Long.parseLong(s.toString())*60000);
                editor.commit();
            }

без изменений в результате.

Проблема в том, что когда пользователь удаляет ВСЕ номера из представления, я получаю сообщение об ошибке. Я думаю, что могу использовать попытку / поймать, но не уверен, какой именно, и если это правильный путь.

Спасибо

PFA Logcat 06-27 23: 16: 00.014: VERBOSE / AlarmManager (2489): установлено: Alarm {48248e28 тип 1 android} 06-27 23: 16: 42.998: DEBUG / AndroidRuntime (30567): выключение виртуальной машины 06-27 23: 16: 42.998: WARN / dalvikvm (30567): threadid = 1: поток завершается с необработанным исключением (группа = 0x4001d7d0) 06-27 23: 16: 43.264: ОШИБКА / AndroidRuntime (30567): ИСКЛЮЧИТЕЛЬНОЕ ИСКЛЮЧЕНИЕ: основное 06-27 23: 16: 43.264: ОШИБКА / AndroidRuntime (30567): java.lang.NumberFormatException: невозможно проанализировать '' как целое число 06-27 23: 16: 43.264: ОШИБКА / AndroidRuntime (30567): на java.lang.Integer.parseInt (Integer.java:412) 06-27 23: 16: 43.264: ОШИБКА / AndroidRuntime (30567): на java.lang.Integer.parseInt (Integer.java:382) 06-27 23: 16: 43.264: ОШИБКА / AndroidRuntime (30567): в java.lang.Integer.valueOf (Integer.java:682) 06-27 23: 16: 43.264: ОШИБКА / AndroidRuntime (30567): на com.neglected.Neglected $ 2.afterTextChanged (Neglected.java:120) 06-27 23: 16: 43.264: ОШИБКА / AndroidRuntime (30567): на android.widget.TextView.sendAfterTextChanged (TextView.java:6339) 06-27 23: 16: 43.264: ОШИБКА / AndroidRuntime (30567): на android.widget.TextView $ ChangeWatcher.afterTextChanged (TextView.java:6522) 06-27 23: 16: 43.264: ОШИБКА / AndroidRuntime (30567): в android.text.SpannableStringBuilder.sendTextHasChanged (SpannableStringBuilder.java:897) 06-27 23: 16: 43.264: ОШИБКА / AndroidRuntime (30567): в android.text.SpannableStringBuilder.change (SpannableStringBuilder.java:401) 06-27 23: 16: 43.264: ОШИБКА / AndroidRuntime (30567): в android.text.SpannableStringBuilder.change (SpannableStringBuilder.java:269) 06-27 23: 16: 43.264: ОШИБКА / AndroidRuntime (30567): на android.text.SpannableStringBuilder.replace (SpannableStringBuilder.java:432) 06-27 23: 16: 43.264: ОШИБКА / AndroidRuntime (30567): в android.text.SpannableStringBuilder.delete (SpannableStringBuilder.java:218) 06-27 23: 16: 43.264: ОШИБКА / AndroidRuntime (30567): в android.text.SpannableStringBuilder.delete (SpannableStringBuilder.java:28) 06-27 23: 16: 43.264: ОШИБКА / AndroidRuntime (30567): в android.text.method.BaseKeyListener.backspace (BaseKeyListener.java:60) 06-27 23: 16: 43.264: ОШИБКА / AndroidRuntime (30567): at android.text.method.BaseKeyListener.onKeyDown (BaseKeyListener.java:123) 06-27 23: 16: 43.264: ОШИБКА / AndroidRuntime (30567): в android.text.method.NumberKeyListener.onKeyDown (NumberKeyListener.java:134) 06-27 23: 16: 43.264: ОШИБКА / AndroidRuntime (30567): на android.widget.TextView.doKeyDown (TextView.java:4479) 06-27 23: 16: 43.264: ОШИБКА / AndroidRuntime (30567): на android.widget.TextView.onKeyDown (TextView.java:4324) 06-27 23: 16: 43.264: ОШИБКА / AndroidRuntime (30567): на android.view.KeyEvent.dispatch (KeyEvent.java:1124) 06-27 23: 16: 43.264: ОШИБКА / AndroidRuntime (30567): на android.view.View.dispatchKeyEvent (View.java:3740) 06-27 23: 16: 43.264: ОШИБКА / AndroidRuntime (30567): на android.view.ViewGroup.dispatchKeyEvent (ViewGroup.java:788) 06-27 23: 16: 43.264: ОШИБКА / AndroidRuntime (30567): на android.view.ViewGroup.dispatchKeyEvent (ViewGroup.java:788) 06-27 23: 16: 43.264: ОШИБКА / AndroidRuntime (30567): на android.view.ViewGroup.dispatchKeyEvent (ViewGroup.java:788) 06-27 23: 16: 43.264: ОШИБКА / AndroidRuntime (30567): на android.view.ViewGroup.dispatchKeyEvent (ViewGroup.java:788) 06-27 23: 16: 43.264: ОШИБКА / AndroidRuntime (30567): на com.android.internal.policy.impl.PhoneWindow $ DecorView.superDispatchKeyEvent (PhoneWindow.java:1883)06-27 23: 16: 43.264: ОШИБКА / AndroidRuntime (30567): на com.android.internal.policy.impl.PhoneWindow.superDispatchKeyEvent (PhoneWindow.java:1154) 06-27 23: 16: 43.264: ОШИБКА / AndroidRuntime (30567): на android.app.Activity.dispatchKeyEvent (Activity.java:2063) 06-27 23: 16: 43.264: ОШИБКА / AndroidRuntime (30567): на com.android.internal.policy.impl.PhoneWindow $ DecorView.dispatchKeyEvent (PhoneWindow.java:1859) 06-27 23: 16: 43.264: ОШИБКА / AndroidRuntime (30567): в android.view.ViewRoot.deliverKeyEventToViewHierarchy (ViewRoot.java:2495) 06-27 23: 16: 43.264: ОШИБКА / AndroidRuntime (30567): на android.view.ViewRoot.handleMessage (ViewRoot.java:1985) 06-27 23: 16: 43.264: ОШИБКА / AndroidRuntime (30567): на android.os.Handler.dispatchMessage (Handler.java:99) 06-27 23: 16: 43.264: ОШИБКА / AndroidRuntime (30567): на android.os.Looper.loop (Looper.java:123) 06-27 23: 16: 43.264: ОШИБКА / AndroidRuntime (30567): на android.app.ActivityThread.main (ActivityThread.java:4627) 06-27 23: 16: 43.264: ОШИБКА / AndroidRuntime (30567): на java.lang.reflect.Method.invokeNative (собственный метод) 06-27 23: 16: 43.264: ОШИБКА / AndroidRuntime (30567): в java.lang.reflect.Method.invoke (Method.java:521) 06-27 23: 16: 43.264: ОШИБКА / AndroidRuntime (30567): на com.android.internal.os.ZygoteInit $ MethodAndArgsCaller.run (ZygoteInit.java:858) 06-27 23: 16: 43.264: ОШИБКА / AndroidRuntime (30567): на com.android.internal.os.ZygoteInit.main (ZygoteInit.java:616) 06-27 23: 16: 43.264: ОШИБКА / AndroidRuntime (30567): в dalvik.system.NativeStart.main (собственный метод) 06-27 23: 16: 43.350: ПРЕДУПРЕЖДЕНИЕ / ActivityManager (2489): Процесс com.neglected слишком часто аварийно завершал работу: уничтожение! 06-27 23: 16: 43.350: WARN / ActivityManager (2489): Принудительное завершение операции com.neglected / .Neglected 06-27 23: 16: 43.358: INFO / Process (2489): отправка сигнала. PID: 30567 SIG: 9 06-27 23: 16: 43.381: INFO / WindowManager (2489): WIN DEATH: Window {47f27e88 com.neglected / com.neglected.Neglected paused = true} 06-27 23: 16: 53.352: ПРЕДУПРЕЖДЕНИЕ / ActivityManager (2489): истекло время ожидания запуска, отменена блокировка включения!

Решение: Изменение if на:

            public void afterTextChanged(Editable s) 
        {
            String minValueStr = inputMinutes.getText().toString();
            if (minValueStr.length() != 0 ) {
                int minValueInt = Integer.valueOf(minValueStr);
                if(isFreeVersion && minValueInt > FREE_VERSION_MAX_NEGLECTED_TIME)
                {
                    showToast("The free version is limited to " + String.valueOf(FREE_VERSION_MAX_NEGLECTED_TIME) + " minutes.");
                    inputMinutes.setText(String.valueOf(FREE_VERSION_MAX_NEGLECTED_TIME));
                }
                else if (minValueInt > 0)
                {
                    editor.putLong("neglectedPeriodMsecs", Long.parseLong(s.toString())*60000);
                    editor.commit();
                }
            }
        }

спасибо за предложения. они помогли мне продолжать искать.

Ответы [ 2 ]

3 голосов
/ 27 июня 2011

Ну, я думаю, это вызвано исключением нулевого указателя или исключением из-за разбора, поскольку вы пытаетесь преобразовать строку в поле edittext в число. Поэтому, когда пользователь очищает текстовое поле, код пытается изменить нулевое значение или пустую строку на число, которое невозможно.

Я не говорю, что это правильный ответ, но это то, что я подумал, увидев ваш код.

Вы можете программно проверить, является ли текстовое поле пустым, а затем написать соответствующую логику, когда для текстового поля задана пустая / пустая строка.

    @Override
    public void afterTextChanged(Editable s) 
    {
      if (inputMinutes.getText != null && !inputMinutes.getText.equals("")) {
        // TODO Auto-generated method stub
        if(isFreeVersion && Integer.valueOf(inputMinutes.getText().toString()) > 120)
            showToast("The free version is limited to 120 minutes.");
        else
        {
            editor.putLong("neglectedPeriodMsecs", Long.parseLong(s.toString())*60000);
            editor.commit();
        }
      }
    }

Если это исключение нулевого указателя, вы можете перехватить его, используя блок try catch.

Если это не так, то будет полезно, если вы опубликуете трассировку стека из своего logcat, который показывает журнал ошибок, чтобы другие могли видеть причины этого.

3 голосов
/ 27 июня 2011

На этой строке:

if(isFreeVersion && Integer.valueOf(inputMinutes.getText().toString()) > 120)

Я бы сначала проверил inputMinutes.getText().toString() != "".

Integer.valueOf("") 

выдаст ошибку.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...