Dans Android Studio après le démarrage d'un nouveau projet et la sélection d'une activité à onglets, une fois le projet généré, le message d'erreur suivant s'affiche dans 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)
Que signifie cette exception et comment y remédier? Il s’agit d’un projet complètement nouveau, j’ai donc fait non aucun changement.
Après avoir mis à jour la nouvelle version d’appcompat vers 24.2.1, j’ai eu le même bogue, Essayez d’abaisser la version à 24.1.1 ou même à une version stable 23.
Dans mon cas, le problème était dû à FloatingActionButton.Behavior.
Voici le code dans la mise en page du coordinateur
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.");
}
}
Et voici le code à l'intérieur de 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;
}
Comme vous pouvez le constater, getInsetDodgeRect retournait true et, pour une raison quelconque, rect ne se croisait pas. Cela cause le problème.
La solution de contournement.
Je pourrais y remédier en étendant simplement le comportement et en écrasant la méthode getInsetDodgeRect pour qu'elle renvoie 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;
}
...
C'est un bogue introduit dans la bibliothèque de support 24.2.1
, voir ici .
Solutions de contournement connues:
Le bogue a été corrigé dans 25.1.0
Le problème est présent lorsque vous utilisez une mise en page basée sur une ancienne version appcompat, recherchez le fichier XML de mise en page et modifiez-le. Effacer les outils: le contexte est résolu et le problème est résolu.
je recevais la même erreur mais certains comment désinstaller l'application et re l'exécuter à nouveau aidé à le résoudre