4

После обновления Design Support Library 23.0.0 и построить SDK 23, мои сбои приложений при попытке уволить Snackbar:Android закусочной падает на связь с библиотекой поддержки проектирования 23.0.0

java.lang.NullPointerException: Attempt to invoke virtual method 'int android.view.MotionEvent.getAction()' on a null object reference 
      at android.support.design.widget.AppBarLayout$Behavior.onInterceptTouchEvent(AppBarLayout.java:729) 
      at android.support.design.widget.AppBarLayout$Behavior.onInterceptTouchEvent(AppBarLayout.java:629) 
      at android.support.design.widget.CoordinatorLayout.performIntercept(CoordinatorLayout.java:357) 
      at android.support.design.widget.CoordinatorLayout.onInterceptTouchEvent(CoordinatorLayout.java:409) 

I гавань» т что-либо изменить, так как обновление, и я использую единственный способ, который я знаю, у для показа закусочной:

Snackbar.make(rootView, getString(R.string.error_no_permissions),Snackbar.LENGTH_LONG).show(); 

Существует проблема сообщалось NPE на CoordinatorLayout, которые могут быть связаны: CoordinatorLayout NullPointerException in onTouchEvent, но я до сих пор не могу найти обходной путь для моей ситуации п. Я попытался это possible solution, но до сих пор не повезло ...

EDIT: Оказывается, решение (как это было предложено @NikolaDespotoski) заменяемое по умолчанию AppBarLayout.Behavior

public class AppBarLayoutBehavior extends AppBarLayout.Behavior { 

    @Override 
    public boolean onInterceptTouchEvent(CoordinatorLayout parent, AppBarLayout child, 
      MotionEvent ev) { 
     return !(parent != null && child != null && ev != null) || super 
       .onInterceptTouchEvent(parent, child, ev); 
    } 
} 

... и использовать его в нашем AppBarLayout

((CoordinatorLayout.LayoutParams) findViewById(R.id.appbar).getLayoutParams()) 
       .setBehavior(new AppBarLayoutBehavior()); 
+1

Если вы посмотрите на билет, который вы связали, вы можете заметить, что он помечен как «FutureRelease», что означает, что проблема исправлена, но она еще не выпущена. Судя по комментарию, сделанному в четверг, 20 августа, «мы хотим получить исправление ASAP», надеюсь, скоро будет выпущена версия, чтобы исправить эту проблему. В противном случае, кажется, лучший способ действий - вернуться к api 22 или игнорировать проблему до тех пор, пока исправление не будет выпущено. –

+0

Похоже на это, но я боюсь, что проблема с закусочной не будет исправлена, так как предлагаемое обходное решение не решает проблему. В любом случае, я думаю, вы правы, было бы лучше, если я вернусь к поддержке дизайна 22.2.1 для производства и сборки SDK 22, но это проблема, так как я начал готовить свое приложение для Android M ... –

+0

Ну, вы может продолжать готовиться к 23.0.0 и игнорировать ошибку до тех пор, пока не будет выпущено исправление, которое, мы надеемся, будет до того, как Android M будет фактически выпущен пользователям. Таким образом, вы не отстаете в этом смысле. И если он выйдет, вам просто нужно построить для 22 –

ответ

3

Других исправить в настоящее время является переопределение onInterceptTouchEvent от AppBarLayout.Behavior и недействительного или нуля MotionEvent отбрасывается, чтобы смягчить крах в супер-реализации.

Это будет резонировать как:

@Override 
public boolean onInterceptTouchEvent(CoordinatorLayout parent, AppBarLayout child, MotionEvent ev){ 
    return ev != null ? super.onInterceptTouchEvent(parent,child, ev) : true; 
} 

Для MotionEvent, что, вероятно, недействительным, мы не будем ничего сделать, поэтому мы делаем унаследованный Behavior думает, что мы уже справились.

+5

Фактически это: «return ev == null || super.onInterceptTouchEvent (parent, child, ev);» так как это: "return ev! = null? super.onTouchEvent (parent, child, ev): true;" не распространяется на касания вообще ... –

1

Проблема, кажется, фиксируется в библиотеке Android поддержки 23.0.1 (сентябрь 2015 г.)

+0

Да, это должно быть, это работает для меня, но есть еще некоторые сбои, сообщаемые в журнале отслеживания проблем для 23.0.1 - могут быть специфическими для устройства ... –

+1

У меня была такая же проблема это было исправлено с помощью библиотеки поддержки Android 23.0.1 –

+0

проблема в библиотеке поддержки 23.1.1 – goonerDroid

1

Я работал вокруг этого (в поддержку библиотеки 24 альфа- и Android N Preview), установив мнение закусочной, чтобы ссылаться на мой content_main. Формат макета ViewGroup, а не мой activity_main. XML-макет ViewGroup (CoordinatorLayout).

То же самое произошло при настройке макета content_main на FrameLayout или CoordinatorLayout.

(шаблон для студии Android для деятельности С помощью FAB использует android.support.design.widget.CoordinatorLayout как макет в Activity_Main и предоставляет второй xml-файл content_main для размещения ваших представлений и т. Д. Внутри (обычно) там в content_main.)

Если у вас возникли проблемы с сбоем Snackbar, когда вы касаетесь его/переместите его, вы можете попробовать изменить представление, переданное в Snackbar.make (layoutViewName ...), на ваш внутренний макет (или какой-либо другой вид) и посмотрите, разрешит ли он это.

К сожалению, это привело к тому, что FAB, который находится в Activity_main, не перемещался так, как должен был, когда появился SnackBar.

Мне пришлось вернуться к 23.2.1 и API 23. Тогда не требуется обходной путь. Затем я смог ссылаться на координатор Activity_mainLayout в качестве первого аргумента в SnackBar.make (view ...). FAB переместился так, как предполагалось, и отключение SnackBar не вызвало сбой.

EDIT: 23.3.0 и выше также должно быть хорошо. Мое намерение упомянуть о возврате к (в то время) 23.2.1 было отмечено, что он НЕ работает в 24 альфа, но WAS работает в стабильной версии 23.x.

Смежные вопросы