Подтвердить что ты не робот

DrawerLayout должен быть измерен с помощью MeasureSpec.EXACTLY error

Я пытаюсь реализовать ящик навигации, но я продолжаю получать эту ошибку. Я видел подобные вопросы, но не работал у меня. У меня есть следующий макет 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>

На моей activity_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);
}

Надеюсь, кто-то поможет мне в правильном направлении.

Большое спасибо заранее!

4b9b3361

Ответ 1

Мой DrawerLayout находился внутри 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>

Затем я решил проблему, изменив layout_height="wrap_content" на layout_height="match_parent" of 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="match_parent"
    android:orientation="vertical"
    android:background="@drawable/abohawawallpapersqr"
    tools:context=".MainActivity">

Ответ 2

Для тех, у кого еще есть исключение, убедитесь, что высота DrawerLayout match_parent

Ответ 3

Это также может произойти из-за нового ConstraintLayout. Убедитесь, что макет ящика не находится в иерархии ConstraintLayout.

Это действительно глупая ошибка в части Android. Я попытаюсь подать на него ошибку.

Ответ 4

Убедитесь, что ваша активность не является активностью "Диалог", проверьте манифест. Я сделал эту ошибку и получил ошибку.

Ответ 5

Это также может произойти, если вы установили layout_width в wrap_content. В моем случае она была решена путем установки ширины на match_parent. Надеюсь, это поможет кому-то.

Ответ 6

requestWindowFeature(Window.FEATURE_NO_TITLE);

была решена моя проблема, создав такую ​​активность, как показано ниже:

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

Ответ 7

использовать этот...

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);
    }
}

Ответ 8

с помощью Android.Support.V4.Widget; используя 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);

    }




}

Ответ 9

По ошибке я устанавливаю настраиваемую тему диалога для активности вместо настраиваемой темы действия:

activity.setTheme(R.style.StyledDialogTheme);

После того как я исправил это, он снова работает.

Ответ 10

Если вы по-прежнему получаете это исключение, убедитесь, что ваша активность заполнена. Экран, определенный в манифесте, вы можете сделать в Activity:

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

Или определите это в 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>

Ответ 11

Не пытайтесь включить файл активности макета ящика в любой другой файл макета

Ответ 12

Получите сборку → Очистить проект, а затем Ошибка перестроить проект.