Я ограничил значение в этом поле 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();
}
}
}
спасибо за предложения. они помогли мне продолжать искать.