我遇到了问题,我无法解决.在我的应用程序中,我有一个导航抽屉定义如下:
activity_main.xml中
- <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" >
- <!-- As the main content view,the view below consumes the entire
- space available using match_parent in both dimensions. -->
- <FrameLayout
- android:id="@+id/container"
- android:layout_width="match_parent"
- android:layout_height="match_parent" />
- <!-- android:layout_gravity="start" tells DrawerLayout to treat
- this as a sliding drawer on the left side for left-to-right
- languages and on the right side for right-to-left languages.
- If you're not building against API 17 or higher,use
- android:layout_gravity="left" instead. -->
- <!-- The drawer is given a fixed width in dp and extends the full height of
- the container. -->
- <fragment android:id="@+id/navigation_drawer"
- android:layout_width="@dimen/navigation_drawer_width"
- android:layout_height="match_parent"
- android:layout_gravity="start" />
在MainActivity类中,我通常使用setContentView传递这个xml:
MainActivity.java
- setContentView(R.layout.activity_main);
- mNavigationDrawerFragment = (NavigationDrawerFragment)
- getSupportFragmentManager().findFragmentById(R.id.navigation_drawer);
在我的NavigationDrawerFragment onCreateView上,我通常用它来膨胀它的xml:
NavigationDrawerFragment.java
- public View onCreateView(LayoutInflater inflater,ViewGroup container,Bundle savedInstanceState) {
- View root = (View)inflater.inflate(R.layout.fragment_navigation_drawer,null,false);
- mDrawerListView = (ListView)root.findViewById(R.id.drawer_list_view);
- mDrawerListView.setOnItemClickListener(new AdapterView.OnItemClickListener() {
- @Override
- public void onItemClick(AdapterView<?> parent,View view,int position,long id) {
- selectItem(position);
- }
- });
这是fragment_navigation_drawer.xml:
fragment_navigation_drawer.xml
- <LinearLayout
- android:orientation="vertical"
- android:layout_width="match_parent"
- android:layout_height="match_parent"
- xmlns:android="http://schemas.android.com/apk/res/android">
- <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
- android:layout_width="match_parent"
- android:layout_height="match_parent"
- android:padding="10dp">
- <ImageView
- android:id="@+id/profile_picture"
- android:layout_width="50dp"
- android:layout_height="50dp"
- android:layout_alignParentLeft="true"/>
- <TextView
- android:id="@+id/user_name"
- android:layout_width="wrap_content"
- android:layout_height="wrap_content"
- android:layout_marginLeft="10dp"
- android:layout_toRightOf="@id/profile_picture"
- android:textStyle="bold"
- android:textSize="15sp" />
- <TextView
- android:id="@+id/user_mail"
- android:layout_width="wrap_content"
- android:layout_height="wrap_content"
- android:layout_below="@id/user_name"
- android:layout_alignLeft="@id/user_name"
- android:fontFamily="sans-serif-light" />
- <ImageView
- android:layout_width="wrap_content"
- android:layout_height="wrap_content"
- android:layout_alignParentRight="true"
- android:src="@android:drawable/ic_menu_close_clear_cancel"/>
- </RelativeLayout>
- <ListView 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:choiceMode="singleChoice"
- android:id="@+id/drawer_list_view"
- android:dividerHeight="0dp"
- android:background="@color/navigation_drawer_background" />
当我运行代码时,我在MainActivity的setContentView上得到一个例外:
- Caused by: java.lang.IllegalStateException: The specified child already has a parent. You must call removeView() on the child's parent first.
我认为NavigationDrawer布局有问题.我究竟做错了什么?
编辑:我将我的布局更改为:
- <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:layout_height="match_parent"/>
- <!-- The navigation drawer -->
- <FrameLayout
- android:id="@+id/left_drawer_frame"
- android:layout_width="@dimen/navigation_drawer_dimension"
- android:layout_height="match_parent"
- android:layout_gravity="start"
- android:background="@android:color/white"/>
所以使用FrameLayout,在我的活动中我使用:
- mFragment = new Fragment();
- getSupportFragmentManager()
- .beginTransaction()
- .replace(R.id.content_frame,mFragment)
- .commit();
我用这个膨胀片段:
- View root = inflater.inflate(R.layout.fragment_main,container,false);
这一切似乎都有效
解决方法
迟到总比不到好.
查看您的代码(变量名称,布局结构等)我假设您使用的是Android Studio,并且您使用Android Studio“创建项目”向导提供的“导航抽屉”模板创建了项目.
如果上述假设为真,那么您的问题就在于NavigationDrawerFragment的onCreateView.你必须从onCreateView返回膨胀的视图,在这种特殊情况下你应该返回的是root而不是mDrawerListView
- public View onCreateView(LayoutInflater inflater,long id) {
- selectItem(position);
- }
- });
- return root;
- // This is wrong
- // return mDrawerListView;
- }
希望这可以帮助.