4

觸摸崩潰升級到設計支持庫23.0.0和建立SDK 23後,我的應用程序崩潰,當我試圖駁回SnackbarAndroid的小吃吧與設計支持庫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) 

我的天堂」 T改爲任何事情,因爲更新和我使用的唯一途徑,我知道關閉顯示小吃吧:

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

有報道NPE上CoordinatorLayout一個問題,可能與:CoordinatorLayout NullPointerException in onTouchEvent但我仍然無法找到解決我的情況ñ。我已經試過這possible solution但仍沒有運氣...

編輯: 原來的解決方案(如@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」,表示問題已修復,但尚未發佈。從8月20日星期四發表的評論來看,「我們希望儘快獲得一個修補程序」,希望很快就會有一個發佈來解決這個問題。否則,看起來最好的行動方式可能是回到api 22,或者在解決方案發布前忽略問題。 –

+0

看起來像這樣,但恐怕Snackbar問題不會得到解決,因爲建議的解決方法無法解決問題。無論如何,我想你是對的,最好是如果我回到設計支持22.2.1的生產和構建SDK 22,但這是一個問題,因爲我開始準備我的Android M應用程序... –

+0

那麼,你可以繼續爲23.0.0做準備,並且在修復發佈之前暫時忽略錯誤,這將在Android M實際發佈給用戶之前有望實現。那樣你就不會落後於此。如果它確實出來,你只需要建立22 –

回答

3

另一個修復暫時被重寫AppBarLayout.BehavioronInterceptTouchEvent和無效的或空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年9月)

+0

是的,它應該是,它適用於我,但仍有一些崩潰報告問題跟蹤器23.0.1 - 可能是設備特定的... –

+1

我有同樣的問題它通過使用支持庫23.1.1上的Android支持庫23.0.1 –

+0

問題得到修復 – goonerDroid

1

我工作圍繞這(在支持庫24阿爾法和Androidñ預覽)來引用我content_main .xml的佈局ViewGroup而不是我的activity_main .xml佈局ViewGroup(CoordinatorLayout)。

將content_main的佈局設置爲FrameLayout或CoordinatorLayout時發生了同樣的情況。

(Android Studio的FAB活動模板使用android.support.design.widget.CoordinatorLayout作爲Activity_Main中的佈局,並提供第二個xml文件content_main,供您放入視圖等內部第二個佈局(通常)存在於content_main中。)

如果您在觸摸/移動Snackbar時碰到問題,可以嘗試將傳遞到Snackbar.make(layoutViewName ...)的視圖更改爲你的最內層佈局(或其他視圖),看看是否能解決它。

不幸的是,這導致activity_main中的FAB不能像SnackBar進入視圖時那樣上移。我不得不恢復到23.2.1和API 23。然後,我可以引用activity_main的CoordinatorLayout作爲SnackBar.make(view ...)中的第一個參數。FAB向上移動,因爲它應該是這樣,並且滑開SnackBar不會導致崩潰。

編輯:23.3.0和更高版本也應該罰款。我提到恢復(當時)23.2.1的意圖是注意到它不是在24 alpha中工作,而是在23.x stable版本中工作。