【问题标题】:view android.widget.linearlayout is not a slidingdrawer查看android.widget.linearlayout不是slidingdrawer
【发布时间】:2014-11-15 09:02:29
【问题描述】:

我需要实现这样的布局:

因此,当 Navigation Drawer 打开时,将带有源的 ImageView 放在 listView 后面。

我的 xml:

   <?xml version="1.0" encoding="UTF-8"?>
<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">
    <!-- The main content view -->
    <FrameLayout
        android:id="@+id/content_frame"
        android:layout_width="match_parent"
        android:background="@drawable/logo"
        android:layout_height="match_parent" />
    <!-- The navigation drawer -->
    <LinearLayout android:layout_width="320dp" android:layout_height="fill_parent" android:orientation="horizontal"
            android:id="@+id/drawer_list_layout"  android:gravity="start">
    <ListView android:id="@+id/left_drawer"
        android:layout_width="150dp"
        android:layout_height="match_parent"
        android:layout_gravity="start|center_vertical"
        android:choiceMode="singleChoice"
        android:divider="@android:color/transparent"
        android:dividerHeight="0dp"
        android:background="#ffffff"/>

        <ImageView android:layout_width="wrap_content" android:id ="@+id/drawer_logo"
        android:layout_height="wrap_content"
                android:src="@drawable/logo"/>
    </LinearLayout>

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

在活动中的实现:

@Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main_activity);

        mDrawerLayout = (DrawerLayout) findViewById(R.id.drawer_layout);
        mDrawerList = (ListView) findViewById(R.id.left_drawer);
        drawer_list_layout = (LinearLayout)findViewById(R.id.drawer_list_layout);
....

但应用程序在方法 selectItem 中崩溃:

 private void selectItem(int position) {
        // Update the main content by replacing fragments
        Fragment fragment = null;
        switch (position) {
        case 0:
            fragment = new MapFragment();
            break;
        case 1:
            fragment = new RegisterFragment();
            break;
        case 2:
            fragment = new AboutProjectFragment();
            break;
        default:
            break;
        }

        // Insert the fragment by replacing any existing fragment
        if (fragment != null) {
            FragmentManager fragmentManager = getSupportFragmentManager();
            fragmentManager.beginTransaction()
                    .replace(R.id.content_frame, fragment).commit();

            // Highlight the selected item, update the title, and close the drawer
            mDrawerList.setItemChecked(position, true);
            setTitle(mScreenTitles[position]);
            mDrawerLayout.closeDrawer(drawer_list_layout); // - the line of crash. 
        } else {
            // Error
        }
    }

我的 onPrepareOptionsMenu

 @Override
    public boolean onPrepareOptionsMenu(Menu menu) {
        // If the nav drawer is open, hide action items related to the content view
        boolean drawerOpen = mDrawerLayout.isDrawerOpen(drawer_list_layout);
        menu.findItem(R.id.action_search).setVisible(!drawerOpen);
        return super.onPrepareOptionsMenu(menu);
    }

所以,指的是thisthis的答案,这些答案与我的相似并实施了所有建议,但我仍然遇到了麻烦。

我的堆栈:

Caused by: java.lang.IllegalArgumentException: View android.widget.LinearLayout{428d39a8 V.E..... ......I. 0,0-0,0 #7f05008d app:id/drawer_list_layout} is not a sliding drawer
        at android.support.v4.widget.DrawerLayout.closeDrawer(DrawerLayout.java:1170)
        at com.redonbas.MainActivity.selectItem(MainActivity.java:174)
        at com.redonbas.MainActivity.onCreate(MainActivity.java:97)
        at android.app.Activity.performCreate(Activity.java:5231)

此外,我重建了项目 - 所以事实并非如此。

有经验的人只是建议我如何在应用程序中实现这样的功能以及崩溃的原因。

【问题讨论】:

    标签: android android-layout listview navigation-drawer


    【解决方案1】:

    我曾经遇到过这个问题,从android:gravity="start"改过来 到android:layout_gravity="start"解决了。

    【讨论】:

      【解决方案2】:

      我遇到了同样的问题,我都实现了

      android:gravity="left"
      

      mDrawerLayout.closeDrawer(Gravity.LEFT); 
      

      最后,我更改了代码中的 LayoutParams,它可以工作:

      DrawerLayout.LayoutParams layoutParams = new DrawerLayout.LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT,
                      ViewGroup.LayoutParams.MATCH_PARENT, Gravity.LEFT);
      mDrawerLayout.updateViewLayout(linearLayout, layoutParams);
      

      【讨论】:

        【解决方案3】:
        Caused by: java.lang.IllegalArgumentException: View android.widget.LinearLayout{428d39a8 V.E..... ......I. 0,0-0,0 #7f05008d app:id/drawer_list_layout} is not a sliding drawer
        

        替换

        boolean drawerOpen = mDrawerLayout.isDrawerOpen(drawer_list_layout);
        

        boolean drawerOpen = mDrawerLayout.isDrawerOpen(Gravity.LEFT); 
        

        将 LinearLayout 的重力改为 LEFT 而不是 START。

        <LinearLayout android:layout_width="320dp" 
            android:layout_height="fill_parent" 
            android:orientation="horizontal"
            android:id="@+id/drawer_list_layout"  
            android:gravity="left">
        

        希望对你有帮助。

        【讨论】:

        • 不,我都实现了,但问题仍然存在。
        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2012-07-12
        • 1970-01-01
        • 2023-04-08
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多