2014-10-25 3 views
0

У меня возникла странная проблема с макетом Drawer и новым AppCompat, пытаясь создать свой материал приложения.DrawerLayout с библиотекой AppCompat Недопустимое исключение аргумента

Я сделал это с такой же активностью, не проблема, но для этого я получаю следующее исключение:

java.lang.IllegalArgumentException: DrawerLayout должна быть измерена с MeasureSpec.EXACTLY.

Ниже мое расположение XML

<?xml version="1.0" encoding="utf-8"?> 
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" 
    xmlns:tools="http://schemas.android.com/tools" 
    android:layout_width="fill_parent" 
    android:layout_height="wrap_content"> 
    <include layout="@layout/toolbar"/> 
    <android.support.v4.widget.DrawerLayout 
     xmlns:android="http://schemas.android.com/apk/res/android" 
     android:id="@+id/drawer_layout" 
     android:layout_width="match_parent" 
     android:layout_height="match_parent"> 
     <LinearLayout 
      android:layout_width="fill_parent" 
      android:layout_height="wrap_content" 
      android:orientation="vertical"> 
      <fragment android:name="com.BoardiesITSolutions.MysqlManager.QueryEditor" 
       android:id="@+id/fragment_queryEditor" 
       android:layout_width="fill_parent" 
       android:layout_height="wrap_content" 
       tools:layout="@layout/query_editor" /> 
      <fragment android:name="com.BoardiesITSolutions.MysqlManager.ResultViewer" 
       android:id="@+id/fragment_resultViewer" 
       android:layout_width="fill_parent" 
       android:layout_height="0dip" 
       android:layout_weight="1" 
       tools:layout="@layout/query_editor" /> 
      <TextView android:id="@+id/query_lblStatus" 
       android:layout_width="fill_parent" 
       android:layout_height="wrap_content" 
       android:gravity="center_horizontal" 
       android:padding="5dp" 
       android:textStyle="bold"/> 
     </LinearLayout> 
      <ListView xmlns:android="http://schemas.android.com/apk/res/android" 
      android:id="@+id/left_drawer" 
      android:layout_width="280dp" 
      android:layout_height="match_parent" 
      android:layout_gravity="start" 
      android:paddingLeft="@dimen/list_padding" 
      android:paddingRight="@dimen/list_padding" 
      android:choiceMode="singleChoice" 
      android:divider="#4e4e4e" 
      android:dividerHeight="1dp" 
      android:background="#111" /> 
     <LinearLayout 
       android:layout_width="280dp" 
       android:layout_height="match_parent" 
       android:layout_gravity="end" 
       android:paddingLeft="@dimen/list_padding" 
       android:paddingRight="@dimen/list_padding" 
       android:background="#4b4b4b"> 
       <TextView android:id="@+id/lblDBDetails_NotConnected" 
        android:layout_width="fill_parent" 
        android:layout_height="wrap_content" 
        android:layout_gravity="center_horizontal" 
        android:gravity="center_horizontal" 
        android:textStyle="bold" 
        android:text="@string/not_connected_to_a_database_use_left_hand_menu_to_connect" 
        android:textColor="@color/black"/> 
      <ExpandableListView 
       android:id="@+id/right_drawer" 
       android:layout_width="fill_parent" 
       android:layout_height="match_parent" 
       android:choiceMode="singleChoice" 
       android:divider="#4e4e4e" 
       android:dividerHeight="1dp" 
       android:background="#4b4b4b" /> 
</LinearLayout> 
    </android.support.v4.widget.DrawerLayout> 
</LinearLayout> 

Ниже, как настроить и инициализирует свою панель навигации

Toolbar toolbar = (Toolbar)findViewById(R.id.toolbar); 
     setSupportActionBar(toolbar); 
    AppCompatNavigationManager navManager = new AppCompatNavigationManager(this, mDrawerLayout, R.string.drawer_open, R.string.drawer_closed); 
      mDrawerToggle = navManager.setDrawerToggle(toolbar); 
      mDrawerLayout.setDrawerListener(mDrawerToggle); 
      mDrawerToggle.setDrawerIndicatorEnabled(true); 
      navManager.prepareActionBar(); 

navManager.setDrawerToggle, возвращает ящик тумблер AppCompat со следующим кодом

public ActionBarDrawerToggle setDrawerToggle(Toolbar toolbar) 
    { 
     ActionBarDrawerToggle actionBarDrawerToggle = new ActionBarDrawerToggle(
       activity, 
       drawerLayout, 
       toolbar, 
       drawerOpen, 
       drawerClosed) 
     { 
      public void onDrawerClosed(View view) 
      { 
       super.onDrawerClosed(view); 
      } 

      public void onDrawerOpened(View drawerView) 
      { 
       super.onDrawerOpened(drawerView); 
      } 
     }; 

     return actionBarDrawerToggle; 
    } 

navManager.prepareActionBar(); делает следующий код:

public void prepareActionBar() 
    { 
     if (android.os.Build.VERSION.SDK_INT >= android.os.Build.VERSION_CODES.HONEYCOMB) 
     { 
      activity.getSupportActionBar().setDisplayHomeAsUpEnabled(true); 
      activity.getSupportActionBar().setHomeButtonEnabled(true); 
     } 
    } 

Мой класс расширяет ActionBarActivity.

Я не понимаю, что делает эту деятельность настолько различной, что вызывает ее исключение.

Спасибо за любую помощь, которую вы можете предоставить.

+0

Вы пытались изменить ширину и высоту корня LinearLayout, чтобы оба были match_parent? Установка его как wrap_content приведет к вложенным представлениям с match_parent, включая DrawerLayout, к измерению как AT_MOST. – alanv

+0

Я сделал да. Однако, хотя это не сбой, а не мой макет был виден, и навигационный ящик не выскользнул – Boardy

+0

Возможно, вы также захотите установить ориентацию на вашем LinearLayout вертикально. Значение по умолчанию - горизонтальное. – alanv

ответ

2

Вам необходимо установить android: orientation = "vertical" и android: layout_width и layout_height в "match_parent" в корневой LinearLayout. Вы можете технически оставить «fill_parent», но это значение устарело и отображается на «match_parent».

Причина этого заключается в том, что «wrap_content» заставит родительский LinearLayout измерять свои дочерние представления, которые используют «match_parent» с режимом измерения AT_MOST. Это позволяет найти минимальный размер, который будет соответствовать детским представлениям.

<?xml version="1.0" encoding="utf-8"?> 
<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"> 
    ... 
+0

Спасибо, что я смотрел на это целую вечность, не видел никакой разницы. Я на самом деле думал, что ориентация должна быть включена, не понимал, что это дефолт. Но это была моя проблема. Спасибо за вашу помощь – Boardy

Смежные вопросы