0

我遇到有關android.support.design.widget.FloatingActionButton的奇怪行爲。我搜索了一下,但沒有發現這個組件的這種錯誤。Android支持庫浮動操作按鈕異常

這隻發生在我用android StrictMode啓用時構建。我得到以下異常:

CoordinatorLayout﹕ Default behavior class android.support.design.widget.FloatingActionButton$a could not be instantiated. Did you forget a default constructor? 
java.lang.InstantiationException: can't instantiate class android.support.design.widget.FloatingActionButton$a; no empty constructor 
     at java.lang.Class.newInstanceImpl(Native Method) 
     at java.lang.Class.newInstance(Class.java:1130) 
     at android.support.design.widget.CoordinatorLayout.a(CoordinatorLayout.java:503) 
     at android.support.design.widget.CoordinatorLayout.onMeasure(CoordinatorLayout.java:579) 
     at android.view.View.measure(View.java:16831) 
     at android.view.ViewGroup.measureChildWithMargins(ViewGroup.java:5245) 
     at android.widget.FrameLayout.onMeasure(FrameLayout.java:310) 
     at android.view.View.measure(View.java:16831) 
     at android.view.ViewGroup.measureChildWithMargins(ViewGroup.java:5245) 
     at android.widget.LinearLayout.measureChildBeforeLayout(LinearLayout.java:1410) 
     at android.widget.LinearLayout.measureVertical(LinearLayout.java:695) 
     at android.widget.LinearLayout.onMeasure(LinearLayout.java:588) 
     at android.view.View.measure(View.java:16831) 
     at android.support.v4.widget.DrawerLayout.onMeasure(DrawerLayout.java:868) 
     at android.view.View.measure(View.java:16831) 
     at android.view.ViewGroup.measureChildWithMargins(ViewGroup.java:5245) 
     at android.widget.FrameLayout.onMeasure(FrameLayout.java:310) 
     at android.view.View.measure(View.java:16831) 
     at android.view.ViewGroup.measureChildWithMargins(ViewGroup.java:5245) 
     at android.widget.LinearLayout.measureChildBeforeLayout(LinearLayout.java:1410) 
     at android.widget.LinearLayout.measureVertical(LinearLayout.java:695) 
     at android.widget.LinearLayout.onMeasure(LinearLayout.java:588) 
     at android.view.View.measure(View.java:16831) 
     at android.view.ViewGroup.measureChildWithMargins(ViewGroup.java:5245) 
     at android.widget.FrameLayout.onMeasure(FrameLayout.java:310) 
     at android.support.v7.internal.widget.ContentFrameLayout.onMeasure(ContentFrameLayout.java:124) 
     at android.view.View.measure(View.java:16831) 
     at android.view.ViewGroup.measureChildWithMargins(ViewGroup.java:5245) 
     at android.widget.LinearLayout.measureChildBeforeLayout(LinearLayout.java:1410) 
     at android.widget.LinearLayout.measureVertical(LinearLayout.java:695) 
     at android.widget.LinearLayout.onMeasure(LinearLayout.java:588) 
     at android.view.View.measure(View.java:16831) 
     at android.view.ViewGroup.measureChildWithMargins(ViewGroup.java:5245) 
     at android.widget.FrameLayout.onMeasure(FrameLayout.java:310) 
     at android.view.View.measure(View.java:16831) 
     at android.view.ViewGroup.measureChildWithMargins(ViewGroup.java:5245) 
     at android.widget.LinearLayout.measureChildBeforeLayout(LinearLayout.java:1410) 
     at android.widget.LinearLayout.measureVertical(LinearLayout.java:695) 
     at android.widget.LinearLayout.onMeasure(LinearLayout.java:588) 
     at android.view.View.measure(View.java:16831) 
     at android.view.ViewGroup.measureChildWithMargins(ViewGroup.java:5245) 
     at android.widget.FrameLayout.onMeasure(FrameLayout.java:310) 
     at com.android.internal.policy.impl.PhoneWindow$DecorView.onMeasure(PhoneWindow.java:2586) 
     at android.view.View.measure(View.java:16831) 
     at android.view.ViewRootImpl.performMeasure(ViewRootImpl.java:2189) 
     at android.view.ViewRootImpl.measureHierarchy(ViewRootImpl.java:1352) 
     at android.view.ViewRootImpl.performTraversals(ViewRootImpl.java:1535) 
     at android.view.ViewRootImpl.doTraversal(ViewRootImpl.java:1249) 
     at android.view.ViewRootImpl$TraversalRunnable.run(ViewRootImpl.java:6364) 
     at android.view.Choreographer$CallbackRecord.run(Choreographer.java:791) 
     at android.view.Choreographer.doCallbacks(Choreographer.java:591) 
     at android.view.Choreographer.doFrame(Choreographer.java:561) 
     at android.view.Choreographer$FrameDisplayEventReceiver.run(Choreographer.java:777) 
     at android.os.Handler.handleCallback(Handler.java:730) 
     at android.os.Handler.dispatchMessage(Handler.java:92) 
     at android.os.Looper.loop(Looper.java:176) 
     at android.app.ActivityThread.main(ActivityThread.java:5419) 
     at java.lang.reflect.Method.invokeN 

然而這並沒有讓我的應用程序崩潰或拋出任何可見的錯誤。每次創建FAB的活動都會拋出它,但FAB渲染並且工作得很好。如果我點擊它,它會做onClickListener應該做的事情。

這是我的Android支持庫的依賴關係,在我的build.gradle

compile 'com.android.support:appcompat-v7:22.2.0' 
compile 'com.android.support:design:22.2.0' 

這是我在我的XML佈局使用FAB:

<android.support.design.widget.CoordinatorLayout 
xmlns:android="http://schemas.android.com/apk/res/android" 
xmlns:app="http://schemas.android.com/apk/res-auto" 
android:layout_width="match_parent" 
android:layout_height="match_parent"> 

<LinearLayout 
    android:layout_width="match_parent" 
    android:layout_height="match_parent" 
    android:orientation="vertical"> 
    <fragment 
     android:id="@+id/home_toolbar_wallet" 
     android:name="my.fragment.class" 
     android:layout_width="match_parent" 
     android:layout_height="wrap_content" /> 
    (...) 
</LinearLayout> 

<android.support.design.widget.FloatingActionButton 
    android:id="@+id/home_floating_button" 
    android:layout_width="wrap_content" 
    android:layout_height="wrap_content" 
    android:src="@drawable/ic_add_white_18dp" 
    android:layout_margin="@dimen/action_button_margin" 
    app:borderWidth="0dp" 
    app:layout_anchor="@id/home_toolbar_wallet" 
    app:layout_anchorGravity="bottom|right|end"/> 

萬一你想知道,這是我如何啓用StrictMode

StrictMode.ThreadPolicy.Builder builder = new StrictMode.ThreadPolicy.Builder builder = new StrictMode.ThreadPolicy.Builder() 
    .detectAll() 
    .penaltyLog(); 
if (Utils.hasHoneycomb()) { 
    builder.penaltyFlashScreen(); 
} 
StrictMode.setThreadPolicy(builder.build()); 
StrictMode.setVmPolicy(new StrictMode.VmPolicy.Builder().detectAll() 
    .penaltyLog() 
    .build()); 

任何人都遇到過這個?

+1

https://code.google.com/p/android/issues/detail?id=178339? – tachyonflux

+0

謝謝,我想出了這一點,並將進行更新! @Distwo的答案是正確的!我已經嘗試過並解決了我的問題 – acrespo

回答

5

這可能是由於proguard混淆了你的代碼。 您是否嘗試將此規則添加到您的proguard規則中?

-keepclassmembers class android.support.design.widget.FloatingActionButton$Behavior { public <init>(); } 
+0

我在佈局上使用自定義的「行爲」並且@distwo完全正確。 Proguard正在撲滅「未使用」的構造函數。有趣的是,AS和Proguard知道不要剔除'View'構造函數,但不知道對'Behaviour'構造函數執行相同的操作... – saywhatnow