NullPointerException отчет от андроид маркета - PullRequest
1 голос
/ 12 мая 2011

Пользователь отправил следующий отчет о сбое:

java.lang.NullPointerException
at android.widget.TextView.onTouchEvent(TextView.java:7202)
at android.view.View.dispatchTouchEvent(View.java:3778)
at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:886)
at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:886)
at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:886)
at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:886)
at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:886)
at com.android.internal.policy.impl.PhoneWindow$DecorView.superDispatchTouchEvent(PhoneWindow.java:1716)
at com.android.internal.policy.impl.PhoneWindow.superDispatchTouchEvent(PhoneWindow.java:1124)
at android.app.Activity.dispatchTouchEvent(Activity.java:2125)
at com.android.internal.policy.impl.PhoneWindow$DecorView.dispatchTouchEvent(PhoneWindow.java:1700)
at android.view.ViewRoot.handleMessage(ViewRoot.java:1822)
at android.os.Handler.dispatchMessage(Handler.java:99)
at android.os.Looper.loop(Looper.java:143)
at android.app.ActivityThread.main(ActivityThread.java:5068)
at java.lang.reflect.Method.invokeNative(Native Method)
at java.lang.reflect.Method.invoke(Method.java:521)
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:858)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:616)
at dalvik.system.NativeStart.main(Native Method)

Я не могу воспроизвести его ни на одном из моих тестовых телефонов (Xperia, HTC Desire, Galaxy S) (или на эмуляторах), и в отчете об ошибке не указывается, где в приложении проблема или на каком устройстве (или кем был пользователь, так что я могу попросить у них больше информации о том, что они делали, что вызвало это). Я не могу найти нигде в коде, где я, очевидно, пытаюсь использовать TextView через findViewById, не проверяя, является ли он нулевым в первую очередь. Ни в одном из XML-файлов нет android:onclick, поэтому он не пытается вызвать опечатку или что-то в этом роде. Я попытался сравнить строки, данные источнику Android, но они не совпадают напрямую, и чтение источника названных методов мне не помогло. (Отказ от ответственности: я использую Java только пару месяцев.)

Кто-нибудь знает, что еще я должен проверить?


ETA: Это единственное место, где у меня есть TouchListener вместо ClickListener здесь:

btnDelete.setOnTouchListener(new View.OnTouchListener()
{
  public boolean onTouch(View v, MotionEvent meMotion)
  {
    int iAction = meMotion.getAction();

    switch (iAction)
    {
      case MotionEvent.ACTION_DOWN:
        if (false == bKeyPressed)
        {
          bKeyPressed = true;
          deleteANumber();
        }
        mHandler.removeCallbacks(mDeleteTouch);
        mHandler.postAtTime(mDeleteTouch, SystemClock.uptimeMillis()
          + BUTTON_DELAY);
        break;
      case MotionEvent.ACTION_UP:
        bKeyPressed = false;
        mHandler.removeCallbacks(mDeleteTouch);
        break;
    }

    return true;
  }
});

, где mDeleteTouch -

private final Runnable mDeleteTouch = new Runnable()
{
  public void run()
  {
    // delete a number from the display
    deleteANumber();

    // then call self in BUTTON_DELAY ms, unless cancelled
    mHandler.postAtTime(this, SystemClock.uptimeMillis() + BUTTON_DELAY);
  }
};

и deleteANumber () -

protected void deleteANumber()
{
  String strNumber = tvNumber.getText().toString();

  // only remove a character if there is at least one:
  if (strNumber.length() > 0)
  {
    strNumber = strNumber.substring(0, strNumber.length() - 1);
    tvNumber.setText(strNumber);
  }
}

, что может быть проблемой, так как вы не можете вызвать null.length (), но tvNumber создается с его текстом, установленным в «», поэтому getText (). ToString () всегда должен возвращать ненулевое значение , верно?


ETA2 Мне удалось получить ту же ошибку на HTC Desire HD, но, похоже, она вылетает, не возвращаясь к моему коду - установка точек останова непосредственно внутри onClick ничего не улавливает.


ETA3 Если я закомментирую tvNumber.setInputType(InputType.TYPE_CLASS_NUMBER);, проблема исчезнет.

Ответы [ 2 ]

2 голосов
/ 26 мая 2011

В HTC Desire HD при касании TextView с установленным setInputType (InputType.TYPE_CLASS_NUMBER) возникает исключение NullPointerException. Выход из этого параметра предотвращает сбой, но требует ручной фильтрации ввода (что не является проблемой в моем случае, но, вероятно, в других людях). Не хорошее решение, но решение без них.

0 голосов
/ 26 мая 2014

Решение не состоит в использовании "setInputType" с TextView . В любом случае вам не нужна фильтрация типов ввода для TextViews, поскольку они предназначены только для отображения текста. Тип ввода необходим только для EditText (и там он работает). У меня была такая же проблема с версиями Android ниже 4.2.

Недостатком является то, что применение типа ввода «пароль» к текстовому представлению действительно имеет смысл, поскольку оно маскирует пароль, который может быть задуман (это было в моем случае). Но это вызывает сбой при прикосновении к просмотру текста.

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