web-dev-qa-db-fra.com

La vue ne peut pas être ancrée sur le parent CoordinatorLayout

ce n'est pas mon application, c'est une application nordique qui a mis sa source sur github et j'essaie d'exécuter le soutce sur ma machine. mais je continue à avoir cette erreur:

03-07 07:12:13.641  12622-12622/com.noxel.apppaneladmintry2 E/AndroidRuntime﹕ FATAL EXCEPTION: main
Process: com.noxel.apppaneladmintry2, PID: 12622
Java.lang.IllegalStateException: View can not be anchored to the the parent CoordinatorLayout
        at Android.support.design.widget.CoordinatorLayout$LayoutParams.resolveAnchorView(CoordinatorLayout.Java:2522)
        at Android.support.design.widget.CoordinatorLayout$LayoutParams.findAnchorView(CoordinatorLayout.Java:2491)
        at Android.support.design.widget.CoordinatorLayout.prepareChildren(CoordinatorLayout.Java:619)
        at Android.support.design.widget.CoordinatorLayout.onMeasure(CoordinatorLayout.Java:670)
        at Android.view.View.measure(View.Java:17442)
        at Android.view.ViewGroup.measureChildWithMargins(ViewGroup.Java:5463)
        at Android.widget.FrameLayout.onMeasure(FrameLayout.Java:430)
        at Android.support.v7.widget.ContentFrameLayout.onMeasure(ContentFrameLayout.Java:135)
        at Android.view.View.measure(View.Java:17442)
        at Android.view.ViewGroup.measureChildWithMargins(ViewGroup.Java:5463)
        at Android.widget.LinearLayout.measureChildBeforeLayout(LinearLayout.Java:1436)
        at Android.widget.LinearLayout.measureVertical(LinearLayout.Java:722)
        at Android.widget.LinearLayout.onMeasure(LinearLayout.Java:613)
        at Android.view.View.measure(View.Java:17442)
        at Android.view.ViewGroup.measureChildWithMargins(ViewGroup.Java:5463)
        at Android.widget.FrameLayout.onMeasure(FrameLayout.Java:430)
        at Android.view.View.measure(View.Java:17442)
        at Android.view.ViewGroup.measureChildWithMargins(ViewGroup.Java:5463)
        at Android.widget.LinearLayout.measureChildBeforeLayout(LinearLayout.Java:1436)
        at Android.widget.LinearLayout.measureVertical(LinearLayout.Java:722)
        at Android.widget.LinearLayout.onMeasure(LinearLayout.Java:613)
        at Android.view.View.measure(View.Java:17442)
        at Android.view.ViewGroup.measureChildWithMargins(ViewGroup.Java:5463)
        at Android.widget.FrameLayout.onMeasure(FrameLayout.Java:430)
        at com.Android.internal.policy.impl.PhoneWindow$DecorView.onMeasure(PhoneWindow.Java:2560)
        at Android.view.View.measure(View.Java:17442)
        at Android.view.ViewRootImpl.performMeasure(ViewRootImpl.Java:2001)
        at Android.view.ViewRootImpl.measureHierarchy(ViewRootImpl.Java:1166)
        at Android.view.ViewRootImpl.performTraversals(ViewRootImpl.Java:1372)
        at Android.view.ViewRootImpl.doTraversal(ViewRootImpl.Java:1054)
        at Android.view.ViewRootImpl$TraversalRunnable.run(ViewRootImpl.Java:5779)
        at Android.view.Choreographer$CallbackRecord.run(Choreographer.Java:767)
        at Android.view.Choreographer.doCallbacks(Choreographer.Java:580)
        at Android.view.Choreographer.doFrame(Choreographer.Java:550)
        at Android.view.Choreographer$FrameDisplayEventReceiver.run(Choreographer.Java:753)
        at Android.os.Handler.handleCallback(Handler.Java:739)
        at Android.os.Handler.dispatchMessage(Handler.Java:95)
        at Android.os.Looper.loop(Looper.Java:135)
        at Android.app.ActivityThread.main(ActivityThread.Java:5257)
        at Java.lang.reflect.Method.invoke(Native Method)
        at Java.lang.reflect.Method.invoke(Method.Java:372)
        at com.Android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.Java:921)
        at com.Android.internal.os.ZygoteInit.main(ZygoteInit.Java:716)

voici la structure de mon activité principale:

    <?xml version="1.0" encoding="utf-8"?>

<Android.support.design.widget.CoordinatorLayout xmlns:Android="http://schemas.Android.com/apk/res/Android"
    xmlns:app="http://schemas.Android.com/apk/res-auto"
    Android:id="@+id/container"
    Android:layout_width="match_parent"
    Android:layout_height="match_parent">

    <Android.support.design.widget.AppBarLayout
        style="@style/HeaderBar"
        Android:layout_width="match_parent"
        Android:layout_height="wrap_content">

        <Android.support.v7.widget.Toolbar
            Android:id="@+id/toolbar"
            Android:layout_width="match_parent"
            Android:layout_height="?actionBarSize"
            Android:theme="@style/ActionBarThemeOverlay"
            app:popupTheme="@style/ActionBarPopupThemeOverlay"
            app:titleTextAppearance="@style/ActionBar.TitleText"/>

        <Android.support.design.widget.TabLayout
            Android:id="@+id/sliding_tabs"
            Android:layout_width="match_parent"
            Android:layout_height="wrap_content"
            app:tabSelectedTextColor="@color/tabSelectedTextColor"
            app:tabTextColor="@color/tabTextColor"
            app:tabIndicatorColor="@color/tabIndicatorColor"
            app:tabGravity="fill"
            app:tabMode="fixed"/>

    </Android.support.design.widget.AppBarLayout>

    <Android.support.v4.view.ViewPager
        Android:id="@+id/view_pager"
        Android:layout_width="match_parent"
        Android:layout_height="match_parent"
        app:layout_behavior="@string/appbar_scrolling_view_behavior" />

    <Android.support.design.widget.FloatingActionButton
        Android:id="@+id/fab_add"
        Android:layout_width="wrap_content"
        Android:layout_height="wrap_content"
        Android:layout_margin="@dimen/fab_margin"
        Android:src="@drawable/fab_ic_add"
        app:backgroundTint="@color/fab_normal"
        app:layout_anchor="@+id/container"
        app:layout_anchorGravity="bottom|right|end"
        app:elevation="4dp"/>

    <ImageView
        Android:layout_width="wrap_content"
        Android:layout_height="wrap_content"
        Android:src="@drawable/background_title"
        Android:layout_gravity="bottom|center"
        Android:layout_marginBottom="6dp"/>

</Android.support.design.widget.CoordinatorLayout>

et ceci est mon code d'écran spash: 

public class SplashscreenActivity extends Activity {
    /** Splash screen duration time in milliseconds */
    private static final int DELAY = 1000;
    @Override
    protected void onCreate(final Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_splashscreen);

        // Jump to MainActivity after DELAY milliseconds
        new Handler().postDelayed(new Runnable() {
            @Override
            public void run() {
                final Intent intent = new Intent(SplashscreenActivity.this, MainActivity.class);
                intent.addFlags(Intent.FLAG_ACTIVITY_NO_ANIMATION);
                intent.putExtra(MainActivity.OPENED_FROM_LAUNCHER, true);
                startActivity(intent);
                finish();
            }
        }, DELAY);
    }

    @Override
    public void onBackPressed() {
        // do nothing. Protect from exiting the application when splash screen is shown
    }

}

et ceci est la mise en page de mon écran de démarrage:

<merge xmlns:Android="http://schemas.Android.com/apk/res/Android"
xmlns:tools="http://schemas.Android.com/tools"
Android:layout_width="match_parent"
Android:layout_height="match_parent"
tools:context=".SplashscreenActivity" >

<ImageView
    Android:layout_width="wrap_content"
    Android:layout_height="wrap_content"
    Android:layout_gravity="center"
    Android:layout_marginBottom="70dp"
    Android:scaleType="center"
    Android:src="@drawable/nordic_logo" />

<ImageView
    Android:layout_width="wrap_content"
    Android:layout_height="wrap_content"
    Android:src="@drawable/background_title"
    Android:layout_gravity="bottom|center"
    Android:layout_marginBottom="6dp"/>

quelqu'un peut-il me dire comment résoudre ce problème?

17
farzaneh

Cela a commencé à se produire dans la bibliothèque de conception de support v.23.2.0 

compile 'com.Android.support:design:23.2.0'

Je sais que cela a commencé avec v23.2.0 car mon application fonctionnait bien avant (v.23.1.2) et a commencé à présenter le même échec après la mise à jour.

L'erreur est simple: 

L'un de vos points de vue est ancré dans la disposition de son coordinateur parent. Cependant, à partir de v.23.2.0, cela n'est plus autorisé.

Je pense que l'erreur est dans votre FAB:

<Android.support.design.widget.FloatingActionButton
    Android:id="@+id/fab_add"
    ...
    app:layout_anchor="@+id/container" 
    ... />

Je crois que id/container est un parent CoordinatorLayout

Fixation

La bonne façon est de changer le layout_anchor et d’utiliser une autre vue comme ancre (Layout parent ou toute autre vue fixée au bas de l’écran).

36
W0rmH0le

La vue à laquelle la FAB est ancrée doit être une vue descendante de CoordinatorLayout.

Et si la vue est une mise en page, le FAB ne doit pas être à l'intérieur de la mise en page, sinon les paramètres de gravité d'ancrage ne fonctionneront pas. Par exemple:

<Android.support.design.widget.CoordinatorLayout
    Android:id="@+id/content_layout"
    Android:layout_width="match_parent"
    Android:layout_height="match_parent">
    .
    .
    .
    <FrameLayout
        Android:id="@+id/attachment_layout"
        Android:layout_width="match_parent"
        Android:layout_height="match_parent" />

    <Android.support.design.widget.FloatingActionButton
        Android:id="@+id/fab"
        Android:layout_width="wrap_content"
        Android:layout_height="wrap_content"
        Android:layout_marginEnd="@dimen/fab_margin_end"
        Android:layout_marginTop="@dimen/fab_margin_top"
        Android:scaleType="center"
        Android:src="@drawable/ic_action_save"
        app:borderWidth="0dp"
        app:elevation="@dimen/fab_elevation"
        app:layout_anchor="@id/attachment_layout"
        app:layout_anchorGravity="top|end"
        app:rippleColor="@color/accent_highlight" />

</Android.support.design.widget.CoordinatorLayout>
4
Jon

Il existe un autre moyen que mon ami a appris aujourd'hui en utilisant l'onglet Design de Studio. J'ai traîné mon FAB pour jeter l'ancre et découvrir ce code -

<Android.support.design.widget.FloatingActionButton
        Android:id="@+id/fab"
        Android:layout_height="wrap_content"
        Android:layout_width="wrap_content"
        Android:layout_margin="@dimen/activity_horizontal_margin"
        Android:src="@drawable/ic_add"
        Android:layout_gravity="center_vertical|center_horizontal"
        app:layout_anchor="@+id/appBar"
        app:layout_anchorGravity="bottom|right" />

Notez que cela fonctionne parfaitement car j'utilise Collapsing Toolbar. J'ai même essayé de régler des largeurs différentes et que cela fonctionne bien.

En outre, il fonctionne dans n’importe quelle version de la bibliothèque de support. Le mien est 25.0.0

2
Saksham Khurana

changer d'application: layout_anchor, ne pas utiliser le coordinateur

1
xushao