web-dev-qa-db-fra.com

DrawerLayout doit être mesuré avec l'erreur MeasureSpec.EXACTLY

J'essaie d'implémenter un tiroir de navigation, mais je continue à avoir cette erreur ... J'ai vu les mêmes questions mais je n'ai pas fonctionné J'ai la mise en page suivante activity_main2.xml:

<Android.support.v4.widget.DrawerLayout
    Android:layout_width="match_parent"
    Android:id="@+id/drawerLayout"
    Android:layout_height="match_parent">

   <FrameLayout xmlns:Android="http://schemas.Android.com/apk/res/Android"
        Android:layout_width="fill_parent"
        Android:layout_height="fill_parent"/>

   <RelativeLayout
        Android:layout_gravity="left|start"
        Android:layout_width="match_parent"
        Android:background="#fff"
        Android:layout_height="match_parent">

        <ListView
            Android:id="@+id/left_drawer"
            Android:layout_width="match_parent"
            Android:layout_height="match_parent"
            Android:divider="#eee"
            Android:background="#fff"
            Android:dividerHeight="1dp" />
    </RelativeLayout>
</Android.support.v4.widget.DrawerLayout>

Sur mon activité_main2.Java

protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main2);
    initView();
    if (toolbar != null) {
        //toolbar.setTitle("");
        setSupportActionBar(toolbar);
    }
    initDrawer();
}

private void initView() {
    leftDrawerList = (ListView) findViewById(R.id.left_drawer);
    toolbar = (Toolbar) findViewById(R.id.toolbar);
    drawerLayout = (DrawerLayout) findViewById(R.id.drawerLayout);
    navigationDrawerAdapter = new ArrayAdapter<String>( MainActivity.this, Android.R.layout.simple_list_item_1, leftSliderData);
    leftDrawerList.setAdapter(navigationDrawerAdapter);
    leftDrawerList.setOnItemClickListener(new AdapterView.OnItemClickListener() {
        @Override
        public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
            if(position == 1){
                drawerLayout.closeDrawer(Gravity.LEFT);
            }
        }
    });
}

private void initDrawer() {
    drawerToggle = new ActionBarDrawerToggle(this, drawerLayout, toolbar, R.string.drawer_open, R.string.drawer_close) {

        @Override
        public void onDrawerClosed(View drawerView) {
            super.onDrawerClosed(drawerView);
        }

        @Override
        public void onDrawerOpened(View drawerView) {
            super.onDrawerOpened(drawerView);
        }
    };
    drawerLayout.setDrawerListener(drawerToggle);
}

J'espère que quelqu'un m'aidera dans la bonne direction.

Merci d'avance!

21
Ismail Rubad

Mon DrawerLayout était dans un LinearLayout:

<LinearLayout xmlns:Android="http://schemas.Android.com/apk/res/Android"
    xmlns:tools="http://schemas.Android.com/tools"
    Android:layout_width="match_parent"
    Android:layout_height="wrap_content"
    Android:orientation="vertical"
    Android:background="@drawable/abohawawallpapersqr"
    tools:context=".MainActivity">

        <include layout="@layout/toolbar" />

        <Android.support.v4.widget.DrawerLayout
            Android:id="@+id/drawerLayout"
            Android:layout_width="match_parent"
            Android:layout_height="match_parent"> 

        <!-- ...... -->
        </Android.support.v4.widget.DrawerLayout>
</LinearLayout>

Ensuite, j'ai résolu le problème en modifiant le layout_height="wrap_content" en layout_height="match_parent" de LinearLayout.So le code est:

<LinearLayout 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"
    Android:orientation="vertical"
    Android:background="@drawable/abohawawallpapersqr"
    tools:context=".MainActivity">
34
Ismail Rubad

Pour ceux qui ont encore une exception, assurez-vous que la hauteur de votre DrawerLayout est match_parent

17
YTerle

Cela peut aussi arriver à cause de la nouvelle ConstraintLayout. Assurez-vous que la disposition des tiroirs ne se trouve pas dans la hiérarchie de ConstraintLayout

C'est un bug vraiment stupide de la part d'Android. Je vais essayer de déposer un bogue pour cela.

12
VipulKumar

Assurez-vous que votre activité n'est pas une activité de "dialogue", vérifiez le manifeste. J'ai commis cette erreur et j'ai eu l'erreur.

9
M. Usman Khan

Cela peut également se produire si vous avez défini layout_width sur wrap_content. Dans mon cas, le problème a été résolu en définissant la largeur sur match_parent. J'espère que ça aide quelqu'un.

7
Dhrumil Patel
requestWindowFeature(Window.FEATURE_NO_TITLE);

mon problème a été résolu en créant l’activité comme ci-dessous;

@Override
public void onCreate(Bundle savedInstanceState) {
    requestWindowFeature(Window.FEATURE_NO_TITLE);
    super.onCreate(savedInstanceState);
    setContentView(R.layout.mainmenu);
}
1
Nadun Priyankarage

utilisez ceci ...

public class CustomDrawerLayout extends DrawerLayout {
public CustomDrawerLayout(Context context) {
       super(context);
}
public CustomDrawerLayout(Context context, AttributeSet attrs) {
       super(context, attrs);
 }
     public CustomDrawerLayout(Context context, AttributeSet attrs, int defStyle) {
       super(context, attrs, defStyle);
}
@Override
protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
      widthMeasureSpec = MeasureSpec.makeMeasureSpec(
      MeasureSpec.getSize(widthMeasureSpec), MeasureSpec.EXACTLY);
      heightMeasureSpec = MeasureSpec.makeMeasureSpec(
      MeasureSpec.getSize(heightMeasureSpec), MeasureSpec.EXACTLY);
      super.onMeasure(widthMeasureSpec, heightMeasureSpec);
    }
}
1
reza jayervand

en utilisant Android.Support.V4.Widget; en utilisant Android.Util;

...

   class MyDrawerLayout: DrawerLayout
{
    public MyDrawerLayout(Context context) : base(context)
    {

    }
    public MyDrawerLayout(Context context, IAttributeSet attrs) : base(context, attrs)
    {

    }
    public MyDrawerLayout(Context context, IAttributeSet attrs, int defStyle) : base(context, attrs, defStyle)
    {

    }
    public MyDrawerLayout(IntPtr context, Android .Runtime.JniHandleOwnership jniHandleOwnership) : base(context, jniHandleOwnership)
    {

    }

    protected override void OnMeasure(int widthMeasureSpec, int heightMeasureSpec)
    {
        widthMeasureSpec = MeasureSpec.MakeMeasureSpec(MeasureSpec.GetSize(widthMeasureSpec), MeasureSpecMode.Exactly);
        heightMeasureSpec = MeasureSpec.MakeMeasureSpec(MeasureSpec.GetSize(heightMeasureSpec), MeasureSpecMode.Exactly);

        base.OnMeasure(widthMeasureSpec, heightMeasureSpec);

    }




}
0
MohammadReza Moradi

Par erreur, j'ai défini un thème de dialogue personnalisé pour l'activité au lieu d'un thème d'activité personnalisé: 

activity.setTheme(R.style.StyledDialogTheme);

Après avoir corrigé cela, cela fonctionne à nouveau.

0
egmontr

Si vous obtenez toujours cette exception, assurez-vous que votre activité est définie à l'écran Dans Manifeste, vous pouvez le faire dans Activity:

Android:theme="@style/Theme.AppCompat.Light.FullScreen"

Ou définissez ceci dans styles.xml:

 <style name="Theme.AppCompat.Light.FullScreen" parent="@style/Theme.AppCompat.Light.NoActionBar">
        <item name="Android:windowNoTitle">false</item>
        <item name="Android:windowActionBar">true</item>
        <item name="Android:windowFullscreen">true</item>
        <item name="Android:windowContentOverlay">@null</item>
    </style>
0
Manoj Rawat