web-dev-qa-db-ja.com

java.lang.IllegalArgumentException:Rectは子の境界と交差する必要があります

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に変更を加えました。

26
goetzc

新しいappcompatバージョンを24.2.1に更新した後、同じバグがありました。バージョンを24.1.1に、または安定した23バージョンに下げるようにしてください。

20

私の場合、問題は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;
}
...
9
jDur

これは、サポートライブラリ24.2.1ここを参照 で導入されたバグです。

既知の回避策:

  • 別のサポートライブラリバージョンにダウングレードする
7
darken

バグは25.1.0で修正されています

3
Ammar

古いバージョンのappcompatに基づくレイアウトを使用した場合に問題が発生し、レイアウトxmlファイルを調べて編集します。消去ツール:コンテキスト属性を削除すると、問題が解決します。

1
aferrer

同じエラーが発生しましたが、アプリをアンインストールして再度実行すると、解決に役立ちました

0
Ismael ozil