Android Studioで新しいプロジェクトを開始し、タブ付きアクティビティを選択した後、プロジェクトがビルドされた後、Android Monitor:
E/AndroidRuntime: FATAL EXCEPTION: main
Process: com.example.app, PID: 23581
Java.lang.IllegalArgumentException: Rect should intersect with child's bounds.
at Android.support.design.widget.CoordinatorLayout.offsetChildByInset(CoordinatorLayout.Java:1319)
at Android.support.design.widget.CoordinatorLayout.onChildViewsChanged(CoordinatorLayout.Java:1257)
at Android.support.design.widget.CoordinatorLayout$OnPreDrawListener.onPreDraw(CoordinatorLayout.Java:1805)
at Android.view.ViewTreeObserver.dispatchOnPreDraw(ViewTreeObserver.Java:847)
at Android.view.ViewRootImpl.performTraversals(ViewRootImpl.Java:1867)
at Android.view.ViewRootImpl.doTraversal(ViewRootImpl.Java:996)
at Android.view.ViewRootImpl$TraversalRunnable.run(ViewRootImpl.Java:5600)
at Android.view.Choreographer$CallbackRecord.run(Choreographer.Java:761)
at Android.view.Choreographer.doCallbacks(Choreographer.Java:574)
at Android.view.Choreographer.doFrame(Choreographer.Java:544)
at Android.view.Choreographer$FrameDisplayEventReceiver.run(Choreographer.Java:747)
at Android.os.Handler.handleCallback(Handler.Java:733)
at Android.os.Handler.dispatchMessage(Handler.Java:95)
at Android.os.Looper.loop(Looper.Java:136)
at Android.app.ActivityThread.main(ActivityThread.Java:5001)
at Java.lang.reflect.Method.invokeNative(Native Method)
at Java.lang.reflect.Method.invoke(Method.Java:515)
at com.Android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.Java:785)
at com.Android.internal.os.ZygoteInit.main(ZygoteInit.Java:601)
at dalvik.system.NativeStart.main(Native Method)
この例外の意味と修正方法を教えてください。それは完全に新しいプロジェクトなので、私はnotに変更を加えました。
新しいappcompatバージョンを24.2.1に更新した後、同じバグがありました。バージョンを24.1.1に、または安定した23バージョンに下げるようにしてください。
私の場合、問題はFloatingActionButton.Behaviorが原因で発生しました。
コーディネーターレイアウト内のコード
if (behavior != null && behavior.getInsetDodgeRect(this, child, rect)) {
// Make sure that it intersects the views bounds
if (!rect.intersect(child.getLeft(), child.getTop(),
child.getRight(), child.getBottom())) {
throw new IllegalArgumentException("Rect should intersect with child's bounds.");
}
}
そして、ここでFloatingActionButton.Behavior内のコード
@Override
public boolean getInsetDodgeRect(@NonNull CoordinatorLayout parent,
@NonNull FloatingActionButton child, @NonNull Rect rect) {
// Since we offset so that any internal shadow padding isn't shown, we need to make
// sure that the shadow isn't used for any dodge inset calculations
final Rect shadowPadding = child.mShadowPadding;
rect.set(child.getLeft() + shadowPadding.left,
child.getTop() + shadowPadding.top,
child.getRight() - shadowPadding.right,
child.getBottom() - shadowPadding.bottom);
return true;
}
ご覧のとおり、getInsetDodgeRectはtrueを返し、何らかの理由でrectが交差していませんでした。これが問題の原因です。
回避策
動作を拡張し、メソッドgetInsetDodgeRectを上書きしてfalseを返すように修正できます。
public class ScrollAwareFABBehavior extends FloatingActionButton.Behavior {
...
@Override
public boolean getInsetDodgeRect(@NonNull CoordinatorLayout parent, @NonNull FloatingActionButton child, @NonNull Rect rect) {
super.getInsetDodgeRect(parent, child, rect);
return false;
}
...
バグは25.1.0で修正されています
古いバージョンのappcompatに基づくレイアウトを使用した場合に問題が発生し、レイアウトxmlファイルを調べて編集します。消去ツール:コンテキスト属性を削除すると、問題が解決します。
同じエラーが発生しましたが、アプリをアンインストールして再度実行すると、解決に役立ちました