Android在抽屉布局中膨胀导航视图给出异常

Posted

技术标签:

【中文标题】Android在抽屉布局中膨胀导航视图给出异常【英文标题】:Android inflating a Navigation view in drawer layout giving exception 【发布时间】:2015-10-31 19:32:53 【问题描述】:

我正在尝试在带有导航抽屉的 android 中实现滑动菜单。但在扩展导航视图时,它给了我一个例外。为什么我会收到此异常?

这是我的代码:

MainActivity.java

        package com.works.vipul.navigationview;
        import android.support.design.widget.NavigationView;
        import android.support.v4.widget.DrawerLayout;
        import android.support.v7.app.ActionBarDrawerToggle;
        import android.support.v7.app.AppCompatActivity;
        import android.os.Bundle;
        import android.support.v7.widget.Toolbar;
        import android.view.Menu;
        import android.view.MenuItem;
        import android.view.View;
        import android.widget.Toast;

        public class MainActivity extends AppCompatActivity 
            private Toolbar toolbar;
            private NavigationView navigationView;
            private DrawerLayout drawerLayout;

            @Override
            protected void onCreate(Bundle savedInstanceState) 
                super.onCreate(savedInstanceState);
                setContentView(R.layout.activity_main);
                toolbar = (Toolbar) findViewById(R.id.toolbar); // Attaching the layout to the toolbar object
                setSupportActionBar(toolbar);
                //Initializing NavigationView
                navigationView = (NavigationView) findViewById(R.id.navigation_view);

                //Setting Navigation View Item Selected Listener to handle the item click of the navigation menu
                navigationView.setNavigationItemSelectedListener(new NavigationView.OnNavigationItemSelectedListener() 

                    // This method will trigger on item Click of navigation menu




                  @Override
                    public boolean onNavigationItemSelected(MenuItem menuItem) 


                        //Checking if the item is in checked state or not, if not make it in checked state
                        if (menuItem.isChecked()) menuItem.setChecked(false);
                        else menuItem.setChecked(true);

                        //Closing drawer on item click
                        drawerLayout.closeDrawers();

                        //Check to see which item was being clicked and perform appropriate action
                        switch (menuItem.getItemId()) 


                            //Replacing the main content with ContentFragment Which is our Inbox View;
                            case R.id.inbox:
                                Toast.makeText(getApplicationContext(), "Inbox Selected", Toast.LENGTH_SHORT).show();
                                ContentFragment fragment = new ContentFragment();
                                android.support.v4.app.FragmentTransaction fragmentTransaction = getSupportFragmentManager().beginTransaction();
                                fragmentTransaction.replace(R.id.frame, fragment);
                                fragmentTransaction.commit();
                                return true;

                            // For rest of the options we just show a toast on click

                            case R.id.starred:
                                Toast.makeText(getApplicationContext(), "Stared Selected", Toast.LENGTH_SHORT).show();
                                return true;
                            case R.id.sent_mail:
                                Toast.makeText(getApplicationContext(), "Send Selected", Toast.LENGTH_SHORT).show();
                                return true;
                            case R.id.drafts:
                                Toast.makeText(getApplicationContext(), "Drafts Selected", Toast.LENGTH_SHORT).show();
                                return true;
                            case R.id.allmail:
                                Toast.makeText(getApplicationContext(), "All Mail Selected", Toast.LENGTH_SHORT).show();
                                return true;
                            case R.id.trash:
                                Toast.makeText(getApplicationContext(), "Trash Selected", Toast.LENGTH_SHORT).show();
                                return true;
                            case R.id.spam:
                                Toast.makeText(getApplicationContext(), "Spam Selected", Toast.LENGTH_SHORT).show();
                                return true;
                            default:
                                Toast.makeText(getApplicationContext(), "Somethings Wrong", Toast.LENGTH_SHORT).show();
                                return true;

                        
                    
                );





                // Initializing Drawer Layout and ActionBarToggle
                drawerLayout = (DrawerLayout) findViewById(R.id.drawer);
               ActionBarDrawerToggle actionBarDrawerToggle = new ActionBarDrawerToggle(this, drawerLayout, toolbar, R.string.openDrawer, R.string.closeDrawer) 

                    @Override
                    public void onDrawerClosed(View drawerView) 
                        // Code here will be triggered once the drawer closes as we dont want anything to happen so we leave this blank
                        super.onDrawerClosed(drawerView);
                    





                    @Override
                    public void onDrawerOpened(View drawerView) 
                        // Code here will be triggered once the drawer open as we dont want anything to happen so we leave this blank

                        super.onDrawerOpened(drawerView);
                    
                ;

                //Setting the actionbarToggle to drawer layout
                drawerLayout.setDrawerListener(actionBarDrawerToggle);

                //calling sync state is necessay or else your hamburger icon wont show up
                actionBarDrawerToggle.syncState();


            





            @Override
            public boolean onCreateOptionsMenu(Menu menu) 
                // Inflate the menu; this adds items to the action bar if it is present.
                getMenuInflater().inflate(R.menu.menu_main, menu);
                return true;
            




            @Override
            public boolean onOptionsItemSelected(MenuItem item) 
                // Handle action bar item clicks here. The action bar will
                // automatically handle clicks on the Home/Up button, so long
                // as you specify a parent activity in AndroidManifest.xml.
                int id = item.getItemId();

                //noinspection SimplifiableIfStatement
                if (id == R.id.action_settings) 
                    return true;
                

                return super.onOptionsItemSelected(item);
            

        

ContentFragment.java

        package com.works.vipul.navigationview;

        import android.app.Fragment;
        import android.os.Bundle;
        import android.support.annotation.Nullable;
        import android.view.LayoutInflater;
        import android.view.View;
        import android.view.ViewGroup;

        /**
         * Created by Shiv on 8/7/2015.
         */
        public class ContentFragment extends android.support.v4.app.Fragment 






            @Override
            public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) 
                View v = inflater.inflate(R.layout.content_fragment,container,false);
                return v;
            
        

这是布局文件:

activity_main.xml

    <android.support.v4.widget.DrawerLayout xmlns:android="http://schemas.android.com/apk/res/android"
        xmlns:tools="http://schemas.android.com/tools"
        xmlns:app="http://schemas.android.com/apk/res-auto"
        android:id="@+id/drawer"
        android:layout_
        android:layout_
        android:fitsSystemWindows="true"
        tools:context=".MainActivity">

        <LinearLayout
            android:layout_
            android:layout_
            android:orientation="vertical"
            >
            <include
                android:id="@+id/toolbar"
                layout="@layout/tool_bar"
                />
            <FrameLayout
                android:id="@+id/frame"
                android:layout_
                android:layout_>

            </FrameLayout>

        </LinearLayout>

        <android.support.design.widget.NavigationView
            android:id="@+id/navigation_view"
            android:layout_
            android:layout_
            android:layout_gravity="start"
            app:headerLayout="@layout/header"
            app:menu="@menu/drawer"
            />
    </android.support.v4.widget.DrawerLayout>

content_fragment.xml

<android.support.v4.widget.DrawerLayout xmlns:android="http://schemas.android.com/apk/res/android"
        xmlns:tools="http://schemas.android.com/tools"
        xmlns:app="http://schemas.android.com/apk/res-auto"
        android:id="@+id/drawer"
        android:layout_
        android:layout_
        android:fitsSystemWindows="true"
        tools:context=".MainActivity">

        <LinearLayout
            android:layout_
            android:layout_
            android:orientation="vertical"
            >
            <include
                android:id="@+id/toolbar"
                layout="@layout/tool_bar"
                />
            <FrameLayout
                android:id="@+id/frame"
                android:layout_
                android:layout_>

            </FrameLayout>

        </LinearLayout>

        <android.support.design.widget.NavigationView
            android:id="@+id/navigation_view"
            android:layout_
            android:layout_
            android:layout_gravity="start"
            app:headerLayout="@layout/header"
            app:menu="@menu/drawer"
            />
    </android.support.v4.widget.DrawerLayout>

header.xml

 <?xml version="1.0" encoding="utf-8"?>
    <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
        android:layout_
        android:layout_
        android:background="@drawable/background_material"
        android:orientation="vertical"
        >

        <de.hdodenhof.circleimageview.CircleImageView
            xmlns:app="http://schemas.android.com/apk/res-auto"
            android:id="@+id/profile_image"
            android:layout_
            android:layout_
            android:src="@drawable/profile"
            app:border_color="#FF000000"
            android:layout_marginLeft="24dp"
            android:layout_centerVertical="true"
            android:layout_alignParentLeft="true"
            android:layout_alignParentStart="true"
            android:layout_marginStart="24dp" />

        <TextView
            android:layout_
            android:layout_
            android:text="Vipul Bansal"
            android:textSize="14sp"
            android:textColor="#FFF"
            android:textStyle="bold"
            android:gravity="left"
            android:paddingBottom="4dp"
            android:id="@+id/username"
            android:layout_above="@+id/email"
            android:layout_alignLeft="@+id/profile_image"
            android:layout_alignStart="@+id/profile_image" />

        <TextView
            android:layout_
            android:layout_
            android:text="vipulbansal59@yahoo.in"
            android:id="@+id/email"
            android:gravity="left"
            android:layout_marginBottom="8dp"
            android:textSize="14sp"
            android:textColor="#fff"
            android:layout_alignParentBottom="true"
            android:layout_alignLeft="@+id/username"
            android:layout_alignStart="@+id/username" />

    </RelativeLayout>

tool_bar.xml

         <android.support.v7.widget.Toolbar             xmlns:android="http://schemas.android.com/apk/res/android"
            android:id="@+id/toolbar"
            android:layout_
            android:layout_
            android:minHeight="?android:attr/actionBarSize"
            android:background="@color/PrimaryColor" />

这是一个例外:

                          08-07 21:46:39.851  16520-16520/com.works.vipul.navigationview E/AndroidRuntime﹕ FATAL EXCEPTION: main
        Process: com.works.vipul.navigationview, PID: 16520
        java.lang.RuntimeException: Unable to start activity ComponentInfocom.works.vipul.navigationview/com.works.vipul.navigationview.MainActivity: android.view.InflateException: Binary XML file line #28: Error inflating class android.support.design.widget.NavigationView
                at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2548)
                at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2607)
                at android.app.ActivityThread.access$900(ActivityThread.java:174)
                at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1325)
                at android.os.Handler.dispatchMessage(Handler.java:102)
                at android.os.Looper.loop(Looper.java:146)
                at android.app.ActivityThread.main(ActivityThread.java:5756)
                at java.lang.reflect.Method.invokeNative(Native Method)
                at java.lang.reflect.Method.invoke(Method.java:515)
                at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:1291)
                at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1107)
                at dalvik.system.NativeStart.main(Native Method)
         Caused by: android.view.InflateException: Binary XML file line #28: Error inflating class android.support.design.widget.NavigationView
                at android.view.LayoutInflater.createView(LayoutInflater.java:626)
                at android.view.LayoutInflater.createViewFromTag(LayoutInflater.java:702)
                at android.view.LayoutInflater.rInflate(LayoutInflater.java:761)
                at android.view.LayoutInflater.inflate(LayoutInflater.java:498)
                at android.view.LayoutInflater.inflate(LayoutInflater.java:398)
                at android.view.LayoutInflater.inflate(LayoutInflater.java:354)
                at android.support.v7.app.AppCompatDelegateImplV7.setContentView(AppCompatDelegateImplV7.java:249)
                at android.support.v7.app.AppCompatActivity.setContentView(AppCompatActivity.java:106)
                at com.works.vipul.navigationview.MainActivity.onCreate(MainActivity.java:22)
                at android.app.Activity.performCreate(Activity.java:5619)
                at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1093)
                at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2512)
        at       android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2607)
        at android.app.ActivityThread.access$900(ActivityThread.java:174)
        at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1325)
        at android.os.Handler.dispatchMessage(Handler.java:102)
        at android.os.Looper.loop(Looper.java:146)
        at android.app.ActivityThread.main(ActivityThread.java:5756)
        at java.lang.reflect.Method.invokeNative(Native Method)
        at java.lang.reflect.Method.invoke(Method.java:515)
        at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:1291)
        at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1107)
        at dalvik.system.NativeStart.main(Native Method)
        Caused by: java.lang.reflect.InvocationTargetException
        at java.lang.reflect.Constructor.constructNative(Native Method)
        at java.lang.reflect.Constructor.newInstance(Constructor.java:423)
        at android.view.LayoutInflater.createView(LayoutInflater.java:600)
        at android.view.LayoutInflater.createViewFromTag(LayoutInflater.java:702)
        at android.view.LayoutInflater.rInflate(LayoutInflater.java:761)
        at android.view.LayoutInflater.inflate(LayoutInflater.java:498)
        at android.view.LayoutInflater.inflate(LayoutInflater.java:398)
        at android.view.LayoutInflater.inflate(LayoutInflater.java:354)
        at android.support.v7.app.AppCompatDelegateImplV7.setContentView(AppCompatDelegateImplV7.java:249)
        at android.support.v7.app.AppCompatActivity.setContentView(AppCompatActivity.java:106)
        at com.works.vipul.navigationview.MainActivity.onCreate(MainActivity.java:22)
        at android.app.Activity.performCreate(Activity.java:5619)
        at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1093)
        at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2512)
        at                android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2607)
        at android.app.ActivityThread.access$900(ActivityThread.java:174)
        at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1325)
        at android.os.Handler.dispatchMessage(Handler.java:102)
        at android.os.Looper.loop(Looper.java:146)
        at android.app.ActivityThread.main(ActivityThread.java:5756)
        at java.lang.reflect.Method.invokeNative(Native Method)
        at java.lang.reflect.Method.invoke(Method.java:515)
        at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:1291)
        at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1107)
        at dalvik.system.NativeStart.main(Native Method)
        Caused by: android.view.InflateException: Binary XML file line #9: Error inflating class de.hdodenhof.circleimageview.CircleImageView
        at android.view.LayoutInflater.createView(LayoutInflater.java:626)
        at android.view.LayoutInflater.createViewFromTag(LayoutInflater.java:702)
        at android.view.LayoutInflater.rInflate(LayoutInflater.java:761)
        at android.view.LayoutInflater.inflate(LayoutInflater.java:498)
        at android.view.LayoutInflater.inflate(LayoutInflater.java:398)
        at android.support.design.internal.NavigationMenuPresenter.inflateHeaderView(NavigationMenuPresenter.java:184)
        at android.support.design.widget.NavigationView.inflateHeaderView(NavigationView.java:227)
        at android.support.design.widget.NavigationView.<init>(NavigationView.java:152)
        at android.support.design.widget.NavigationView.<init>(NavigationView.java:88)
        at java.lang.reflect.Constructor.constructNative(Native Method)
        at java.lang.reflect.Constructor.newInstance(Constructor.java:423)
        at android.view.LayoutInflater.createView(LayoutInflater.java:600)
        at android.view.LayoutInflater.createViewFromTag(LayoutInflater.java:702)
        at android.view.LayoutInflater.rInflate(LayoutInflater.java:761)
        at android.view.LayoutInflater.inflate(LayoutInflater.java:498)
        at android.view.LayoutInflater.inflate(LayoutInflater.java:398)
        at android.view.LayoutInflater.inflate(LayoutInflater.java:354)
        at android.support.v7.app.AppCompatDelegateImplV7.setContentView(AppCompatDelegateImplV7.java:249)
        at android.support.v7.app.AppCompatActivity.setContentView(AppCompatActivity.java:106)
        at com.works.vipul.navigationview.MainActivity.onCreate(MainActivity.java:22)
        at android.app.Activity.performCreate(Activity.java:5619)
        at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1093)
        at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2512)
        at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2607)
        at android.app.ActivityThread.access$900(ActivityThread.java:174)
        at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1325)
        at android.os.Handler.dispatchMessage(Handler.java:102)
        at android.os.Looper.loop(Looper.java:146)
        at android.app.ActivityThread.main(ActivityThread.java:5756)
        at java.lang.reflect.Method.invokeNative(Native Method)
        at java.lang.reflect.Method.invoke(Method.java:515)
        at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:1291)
        at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1107)
        at dalvik.system.NativeStart.main(Native Method)
        Caused by: java.lang.reflect.InvocationTargetException
        at java.lang.reflect.Constructor.constructNative(Native Method)
        at java.lang.reflect.Constructor.newInstance(Constructor.java:423)
        at android.view.LayoutInflater.createView(LayoutInflater.java:600)
        at android.view.LayoutInflater.createViewFromTag(LayoutInflater.java:702)
        at android.view.LayoutInflater.rInflate(LayoutInflater.java:761)
        at android.view.LayoutInflater.inflate(LayoutInflater.java:498)
        at android.view.LayoutInflater.inflate(LayoutInflater.java:398)
        at android.support.design.internal.NavigationMenuPresenter.inflateHeaderView(NavigationMenuPresenter.java:184)
        at android.support.design.widget.NavigationView.inflateHeaderView(NavigationView.java:227)
        at android.support.design.widget.NavigationView.<init>(NavigationView.java:152)
        at android.support.design.widget.NavigationView.<init>(NavigationView.java:88)
        at java.lang.reflect.Constructor.constructNative(Native Method)
        at java.lang.reflect.Constructor.newInstance(Constructor.java:423)
        at android.view.LayoutInflater.createView(LayoutInflater.java:600)
        at android.view.LayoutInflater.createViewFromTag(LayoutInflater.java:702)
        at android.view.LayoutInflater.rInflate(LayoutInflater.java:761)
        at android.view.LayoutInflater.inflate(LayoutInflater.java:498)
        at android.view.LayoutInflater.inflate(LayoutInflater.java:398)
        at android.view.LayoutInflater.inflate(LayoutInflater.java:354)
        at android.support.v7.app.AppCompatDelegateImplV7.setContentView(AppCompatDelegateImplV7.java:249)
        at android.support.v7.app.AppCompatActivity.setContentView(AppCompatActivity.java:106)
        at com.works.vipul.navigationview.MainActivity.onCreate(MainActivity.java:22)
        at android.app.Activity.performCreate(Activity.java:5619)
        at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1093)
        at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2512)
        at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2607)
        at android.app.ActivityThread.access$900(ActivityThread.java:174)
        at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1325)
        at android.os.Handler.dispatchMessage(Handler.java:102)
        at android.os.Looper.loop(Looper.java:146)
        at android.app.ActivityThread.main(ActivityThread.java:5756)
        at java.lang.reflect.Method.invokeNative(Native Method)
        at java.lang.reflect.Method.invoke(Method.java:515)
        at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:1291)
        at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1107)
        at dalvik.system.NativeStart.main(Native Method)
        Caused by: java.lang.OutOfMemoryError
        at android.graphics.BitmapFactory.nativeDecodeAsset(Native Method)
        at android.graphics.BitmapFactory.decodeStream(BitmapFactory.java:738)
        at android.graphics.BitmapFactory.decodeResourceStream(BitmapFactory.java:563)
        at android.graphics.drawable.Drawable.createFromResourceStream(Drawable.java:889)
        at android.content.res.Resources.loadDrawable(Resources.java:3471)
        at android.content.res.TypedArray.getDrawable(TypedArray.java:602)
        at android.widget.ImageView.<init>(ImageVi
        08-07 21:46:41.911  16520-16520/com.works.vipul.navigationview I/Process﹕ Sending signal. PID: 16520 SIG: 9

              

导航视图出现异常的原因是什么?

【问题讨论】:

【参考方案1】:

"InflateException: Binary XML file line #28: Error inflating class android.support.design.widget.NavigationView" ,意味着它在其代码域中找不到导航视图,因此无法对其进行膨胀。

可能是您这边的参考链接错误。请检查您的 gradle 文件。 您可能需要单独的 NavigationView 库,仅包括 android 支持 v7 是不够的。或者你可以检查here

【讨论】:

我也使用过 'com.android.support:design:22.2.0 库 这是我的 gradle: dependencies compile fileTree(dir: 'libs', include: ['*.jar']) compile 'com.android.support:appcompat-v7:22.2.0'编译'de.hdodenhof:circleimageview:1.3.0' 编译'com.android.support:design:22.2.0' 【参考方案2】:

它的原因

Caused by: java.lang.OutOfMemoryError

检查 de.hdodenhof.circleimageview.CircleImageView 中的位图

【讨论】:

以上是关于Android在抽屉布局中膨胀导航视图给出异常的主要内容,如果未能解决你的问题,请参考以下文章

使用导航膨胀布局时出错

具有多个 Activity 的 Android 导航抽屉

Android:如何使用自定义布局创建导航抽屉

Android中的导航抽屉空指针异常

带有导航抽屉的 Android 文件管理器

Android NavigationView 导航抽屉的使用