【问题标题】:Closing DrawerLayout causes exception : LinearLayout cannot be cast to DrawerLayout关闭 DrawerLayout 导致异常:LinearLayout cannot be cast to DrawerLayout
【发布时间】:2016-04-05 16:37:46
【问题描述】:

我正在尝试创建一个包含 ListView 的自定义 DrawerLayout,但我无法使其正常工作。在包装 LinearLayout 的内容之前,我能够使其工作,以便能够使其更加自定义并在 ListView 上方添加一个图像。

当我在传递 linearLayout 时尝试 closeDrawer() 时,我一直遇到这个异常,我已经看到多篇关于此类问题的帖子,但大多数人的解决方法是将 LinearLayout 传递给 closeDrawer() 函数,我已经这样做了:

04-05 12:17:10.100 18879-18879/com.plante.android.cobalt E/AndroidRuntime: FATAL EXCEPTION: main
 Process: com.plante.android.cobalt, PID: 18879
 java.lang.RuntimeException: Unable to start activity ComponentInfo{com.plante.android.cobalt/com.plante.android.cobalt.activityv2.ActivityHome}: java.lang.ClassCastException: android.widget.LinearLayout$LayoutParams cannot be cast to android.support.v4.widget.DrawerLayout$LayoutParams
     at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2416)
     at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2476)
     at android.app.ActivityThread.-wrap11(ActivityThread.java)
     at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1344)
     at android.os.Handler.dispatchMessage(Handler.java:102)
     at android.os.Looper.loop(Looper.java:148)
     at android.app.ActivityThread.main(ActivityThread.java:5417)
     at java.lang.reflect.Method.invoke(Native Method)
     at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:726)
     at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:616)
  Caused by: java.lang.ClassCastException: android.widget.LinearLayout$LayoutParams cannot be cast to android.support.v4.widget.DrawerLayout$LayoutParams
     at android.support.v4.widget.DrawerLayout.isDrawerView(DrawerLayout.java:1415)
     at android.support.v4.widget.DrawerLayout.closeDrawer(DrawerLayout.java:1630)
     at com.plante.android.cobalt.activityv2.ActivityHome.selectItem(ActivityHome.java:190)
     at com.plante.android.cobalt.activityv2.ActivityHome.onCreate(ActivityHome.java:155)
     at android.app.Activity.performCreate(Activity.java:6251)
     at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1107)
     at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2369)
     at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2476) 
     at android.app.ActivityThread.-wrap11(ActivityThread.java) 
     at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1344) 
     at android.os.Handler.dispatchMessage(Handler.java:102) 
     at android.os.Looper.loop(Looper.java:148) 
     at android.app.ActivityThread.main(ActivityThread.java:5417) 
     at java.lang.reflect.Method.invoke(Native Method) 
     at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:726) 
     at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:616) 

这是我的活动:

@Bind(R.id.drawer_layout)
DrawerLayout mDrawerLayout;
@Bind(R.id.actionToolbar)
Toolbar toolbar;
@Bind(R.id.left_drawer_item)
LinearLayout mDrawerLinear;
@Bind(R.id.left_drawer_child)
ListView mDrawerListChild;

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_v2_home);
    ButterKnife.bind(this);

    setSupportActionBar(toolbar);
    getSupportActionBar().setTitle(getResources().getString(R.string.app_name));
    getSupportActionBar().setDisplayHomeAsUpEnabled(true);
    getSupportActionBar().setHomeButtonEnabled(true);

    mPlanTitles = getResources().getStringArray(R.array.plan_list);

    mDrawerLayout.setDrawerShadow(R.drawable.drawer_shadow, GravityCompat.START);
    // set up the drawer's list view with items and click listener
    ArrayList<String> myList = new ArrayList<>();
    myList.add("First Item");
    myList.add("Second Item");
    mDrawerListChild.setAdapter(new DrawerListAdapter(this, R.layout.drawer_layout_item, myList));
    mDrawerListChild.setOnItemClickListener(new DrawerItemClickListener());

    // enable ActionBar app icon to behave as action to toggle nav drawer

    mDrawerToggle = new ActionBarDrawerToggle(
            this,                  /* host Activity */
            mDrawerLayout,         /* DrawerLayout object */
            toolbar,  /* nav drawer image to replace 'Up' caret */
            R.string.drawer_open,  /* "open drawer" description for accessibility */
            R.string.drawer_close  /* "close drawer" description for accessibility */
    ) {
        public void onDrawerClosed(View view) {
            //syncActionBarArrowState();
        }

        public void onDrawerOpened(View drawerView) {
            //mDrawerToggle.setDrawerIndicatorEnabled(true);
        }
    };
    getSupportFragmentManager().addOnBackStackChangedListener(mOnBackStackChangedListener);
    mDrawerLayout.setDrawerListener(mDrawerToggle);
    setSupportActionBar(toolbar);
    user = getUser();

    if (savedInstanceState == null) {
        selectItem(0);
    }

}


private void selectItem(int position) {
    BackHandledFragment fragment = new FragmentMobilePlan();
    setSelectedFragment(fragment);

    FragmentTransaction ft = getSupportFragmentManager().beginTransaction();
    ft.setCustomAnimations(R.anim.pull_in_right, R.anim.push_out_left, R.anim.pull_in_left, R.anim.push_out_right);
    ft.replace(R.id.content_frame, fragment)
            .commit();

    // update selected item and title, then close the drawer
    mDrawerListChild.setItemChecked(position, true);
    setTitle(mPlanTitles[position]);
    mDrawerLayout.closeDrawer(mDrawerLinear);
}

这是我的布局:

<android.support.v4.widget.DrawerLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:id="@+id/drawer_layout"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    tools:context=".MainActivity">

    <LinearLayout
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:gravity="center"
        android:orientation="vertical">

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

        <FrameLayout
            android:id="@+id/content_frame"
            android:layout_width="match_parent"
            android:layout_height="match_parent" />

        <LinearLayout
            android:id="@+id/left_drawer_item"
            android:layout_width="200dp"
            android:layout_height="match_parent"
            android:layout_gravity="start"
            android:orientation="vertical">

            <ImageView
                android:id="@+id/profilIcon"
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:src="@drawable/ic_people1blue2x" />

            <ListView
                android:id="@+id/left_drawer_child"
                android:layout_width="match_parent"
                android:layout_height="match_parent"
                android:choiceMode="singleChoice"
                android:divider="@android:color/transparent"
                android:dividerHeight="0dp"
                android:background="#111" />

        </LinearLayout>

    </LinearLayout>

</android.support.v4.widget.DrawerLayout>

【问题讨论】:

标签: android android-layout navigation-drawer


【解决方案1】:

对于那些偶然发现相同问题的人,我遇到了这个异常,因为我为 closeDrawer() 传递给 DrawerLayout 的 LinearLayout 不是我 XML 中 DrawerLayout 的第二个子项。它必须直接在抽屉布局中。

【讨论】:

    猜你喜欢
    • 2015-04-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-01-17
    • 1970-01-01
    • 2021-11-12
    • 1970-01-01
    相关资源
    最近更新 更多