InflateException上inflater.inflate()方法调用 [英] InflateException on inflater.inflate() method call

查看:197
本文介绍了InflateException上inflater.inflate()方法调用的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我一直在试图夸大我的 MenuAdapter 类视图得到一个InflateException。我已经包围了麻烦code在try-catch块,并收到错误消息:

链接整个项目:

https://docs.google.com/file/d/ 0B2Iwl4UysxOMa3E5a1l2SHZwOG8 /编辑?USP =共享


  

二进制XML文件行#1:错误充气类


这里是code:

 包com.example.sidemenututorial;进口android.content.Context;
进口android.view.LayoutInflater;
进口android.view.View;
进口android.view.ViewGroup;
进口android.widget.BaseAdapter;
进口android.widget.ImageView;
进口android.widget.TextView;公共类MenuListAdapter延伸BaseAdapter {    //字段----------------------------------------------- ------------------
    私人上下文的背景下;
    私有String []标题;
    私有String []字幕;
    私人诠释[]图标;
    私人LayoutInflater吹气;    //构造----------------------------------------------- -------------
    公共MenuListAdapter(
            上下文的背景下,
            的String []冠军,
            的String []字幕,
            INT []图标){
        this.context =背景;
        this.titles =职称;
        this.subtitles =字幕;
        this.icons =图标;
        吹气=(LayoutInflater)context.getSystemService(
                Context.LAYOUT_INFLATER_SERVICE);
    }    //访问器----------------------------------------------- ---------------
    @覆盖
    公众诠释的getCount(){
        返回titles.length;
    }
    @覆盖
    公共对象的getItem(INT位置){
        回到标题[位置]
    }
    @覆盖
    众长getItemId(INT位置){
        返回的位置;
    }    // 方法 - - - - - - - - - - - - - - - - - - - - - - - - -----------------
    公共查看getView(INT位置,查看convertView,父母的ViewGroup){        ViewHolder viewHolder;        //只有膨胀的观点,如果convertView为null
        如果(convertView == NULL){
            viewHolder =新ViewHolder();
            convertView = inflater.inflate(
                    R.layout.drawer_list_item,父母,假);
            viewHolder.txtTitle =(TextView中)convertView.findViewById(
                    R.id.title);
            viewHolder.txtSubtitle =(TextView中)convertView.findViewById(
                    R.id.subtitle);
            viewHolder.imgIcon =(ImageView的)convertView.findViewById(
                    R.id.icon);            //这是第一次这种观点已经被夸大,
            //这样的观点持有者存储在其标签领域
            convertView.setTag(viewHolder);
        }其他{
            viewHolder =(ViewHolder)convertView.getTag();
        }        //根据需要设置的意见领域
        viewHolder.txtTitle.setText(标题[位置]);
        viewHolder.txtSubtitle.setText(字幕[位置]);
        viewHolder.imgIcon.setImageResource(图标[位置]);        返回convertView;
    }    //类----------------------------------------------- -----------------
    静态类ViewHolder {
        TextView的txtTitle;
        TextView的txtSubtitle;
        ImageView的imgIcon;
    }}这里是它试图膨胀时,drawer_list_item.xml的观点:        <的LinearLayout
        的xmlns:机器人=htt​​p://schemas.android.com/apk/res/android
            机器人:layout_width =match_parent
            机器人:layout_height =match_parent
            机器人:背景=机器人:彩色/ darker_gray
            机器人:方向=横向
            风格=ATTR / DROPDOWNLIST preferredItemHeight?>        < ImageView的
            机器人:ID =@ + ID /图标
            机器人:layout_width =WRAP_CONTENT
            机器人:layout_height =match_parent
            机器人:adjustViewBounds =真/>        <的LinearLayout
            机器人:layout_width =WRAP_CONTENT
            机器人:layout_height =match_parent
            机器人:重力=center_vertical |左
            机器人:方向=垂直>            <的TextView
                机器人:ID =@ + ID /标题
                机器人:layout_width =WRAP_CONTENT
                机器人:layout_height =WRAP_CONTENT
                机器人:ellipsize =结束
                机器人:单线=真
                风格= /&GTATTR / spinnerDropDownItemStyle?
            <的TextView
                机器人:ID =@ + ID /副标题
                机器人:layout_width =WRAP_CONTENT
                机器人:layout_height =WRAP_CONTENT
                机器人:ellipsize =结束
                机器人:单线=真
                机器人:textAppearance =?ATTR / textAppearanceSmall
                风格= /&GTATTR / spinnerDropDownItemStyle?        < / LinearLayout中>    < / LinearLayout中>

这里是客户端code调用该菜单适配器:

 包com.example.sidemenututorial;    进口android.content.res.Configuration;
    进口android.os.Bundle;
    进口android.support.v4.app.ActionBarDrawerToggle;
    进口android.support.v4.app.Fragment;
    进口android.support.v4.app.FragmentTransaction;
    进口android.support.v4.view.GravityCompat;
    进口android.support.v4.widget.DrawerLayout;
    进口android.view.View;
    进口android.widget.AdapterView;
    进口android.widget.ListView;    进口com.actionbarsherlock.app.SherlockFragmentActivity;
    进口com.actionbarsherlock.view.MenuItem;    公共类MainActivity扩展SherlockFragmentActivity {        //字段----------------------------------------------- ------------------
        私人DrawerLayout drawerLayout;
        私人的ListView drawerList;
        私人ActionBarDrawerToggle drawerToggle;
        私人MenuListAdapter menuAdapter;
        私人诠释[]图标;
        私人片段片段1;
        私人片段fragment2;
        私人片段fragment3;
        私人CharSequence的drawerTitle;
        私人CharSequence的称号;
        私人最终的String []标题=新的String [] {
                标题片段#1,
                标题片段#2,
                标题片段#3
        };
        私人最终的String [] =字幕新的String [] {
                字幕片段#1,
                字幕片段#2,
                字幕片段#3
        };        //生命周期回调---------------------------------------------- ------
        @覆盖
        保护无效的onCreate(捆绑savedInstanceState){            //基地实行
            super.onCreate(savedInstanceState);
            的setContentView(R.layout.activity_main);            //实例片段
            片段1 =新片段1();
            fragment2 =新Fragment2();
            fragment3 =新Fragment3();            //这项活动获得冠军
            标题= drawerTitle =的getTitle();            //从绘制资源文件夹的图标
            图标= INT新[] {
                    R.drawable.action_about,
                    R.drawable.action_settings,
                    R.drawable.collections_cloud
            };            //从XML文件中的抽屉布局,里面的ListView控件
            drawerLayout =(DrawerLayout)findViewById(R.id.drawer_layout);
            drawerList =(ListView控件)findViewById(R.id.listview_drawer);            //设置自定义阴影的覆盖的主要内容
            //当抽屉打开
            drawerLayout.setDrawerShadow(
                    R.drawable.drawer_shadow,GravityCompat.START);            //传递字符串数组的MenuListAdapter,设置抽屉
            //名单适配器,并设置其点击监听器
            menuAdapter =新MenuListAdapter(
                    MainActivity.this,标题,副标题,图标);
            drawerList.setAdapter(menu​​Adapter);
            drawerList.setOnItemClickListener(新DrawerItemClickListener());            //启用操作栏中有向上导航
            getSupportActionBar()setHomeButtonEnabled(真)。
            getSupportActionBar()setDisplayHomeAsUpEnabled(真)。            //允许的操作键切换抽屉
            drawerToggle =新ActionBarDrawerToggle(
                    这个,
                    drawerLayout,
                    R.drawable.ic_drawer,
                    R.string.drawer_open,
                    R.string.drawer_close){                公共无效onDrawerClosed(查看视图){
                    super.onDrawerClosed(视图);
                }
                公共无效onDrawerOpened(查看视图){
                    。getSupportActionBar()的setTitle(drawerTitle);
                    super.onDrawerOpened(视图);
                }
            };
            drawerLayout.setDrawerListener(drawerToggle);            //如果这是第一次打开这个活动,
            //使用装载片段#1开始
            如果(savedInstanceState == NULL){
                选择信息(0);
            }        }        // 方法 - - - - - - - - - - - - - - - - - - - - - - - - -----------------
        @覆盖
        公共布尔onOptionsItemSelected(菜单项项){            //如果用户有pressed操作栏图标
            如果(item.getItemId()== android.R.id.home){                //如果抽屉打开,关闭它;反之亦然
                如果(drawerLayout.isDrawerOpen(drawerList)){
                    drawerLayout.closeDrawer(drawerList);
                }其他{
                    drawerLayout.openDrawer(drawerList);
                }
            }            //完成通过让超类做休息
            返回super.onOptionsItemSelected(项目);        }
        @覆盖
        保护无效onPostCreate(捆绑savedInstanceState){            //调用超级实施和同步抽屉
            super.onPostCreate(savedInstanceState);
            drawerToggle.syncState();        }
        @覆盖
        公共无效onConfigurationChanged(配置NEWCONFIG){            //调用超上实行本次活动
            //和抽屉切换对象
            super.onConfigurationChanged(NEWCONFIG);
            drawerToggle.onConfigurationChanged(NEWCONFIG);        }
        私人无效选择信息(INT位置){            //创建一个新片段事务并启动它
            FragmentTransaction fragTran = getSupportFragmentManager()
                                           .beginTransaction();            //找到选定的位置更换内容视图
            用数字的选择的片段//
            开关(位置){
                情况下0:{
                    fragTran.replace(R.id.content_frame,片段1);
                    打破;
                }
                情况1:{
                    fragTran.replace(R.id.content_frame,fragment2);
                    打破;
                }
                案例2:{
                    fragTran.replace(R.id.content_frame,fragment3);
                    打破;
                }
            }            //提交事务,并关上抽屉
            fragTran.commit();
            drawerList.setItemChecked(位置,真正的);
            drawerLayout.closeDrawer(drawerList);        }
        公共无效的setTitle(CharSequence的标题){            //保存在标题中传递,并设置操作栏标题
            this.title =称号;
            getSupportActionBar()的setTitle(职称)。        }        //类----------------------------------------------- -----------------
        私有类DrawerItemClickListener
        实现ListView.OnItemClickListener {            @覆盖
            公共无效onItemClick(
                    适配器视图<>父母,
                    视图来看,
                    INT位置,
                    长ID){                //点​​击后,选择打开相应的片段
                选择信息(位置);            }        }    }

以及日志崩溃的:

  09-26 16:45:43.081:D / AndroidRuntime(1121):关闭VM
09-26 16:45:43.081:W / dalvikvm(1121):主题ID = 1:螺纹未捕获的异常(组= 0x409961f8)退出
09-26 16:45:45.561:E / AndroidRuntime(1121年):致命异常:主要
09-26 16:45:45.561:E / AndroidRuntime(1121年):显示java.lang.NullPointerException
09-26 16:45:45.561:E / AndroidRuntime(1121年):在com.example.sidemenututorial.MenuListAdapter.getView(MenuListAdapter.java:73)
09-26 16:45:45.561:E / AndroidRuntime(1121年):在android.widget.AbsListView.obtainView(AbsListView.java:2033)
09-26 16:45:45.561:E / AndroidRuntime(1121年):在android.widget.ListView.makeAndAddView(ListView.java:1772)
09-26 16:45:45.561:E / AndroidRuntime(1121年):在android.widget.ListView.fillDown(ListView.java:672)
09-26 16:45:45.561:E / AndroidRuntime(1121年):在android.widget.ListView.fillFromTop(ListView.java:732)
09-26 16:45:45.561:E / AndroidRuntime(1121年):在android.widget.ListView.layoutChildren(ListView.java:1625)
09-26 16:45:45.561:E / AndroidRuntime(1121年):在android.widget.AbsListView.onLayout(AbsListView.java:1863)
09-26 16:45:45.561:E / AndroidRuntime(1121年):在android.view.View.layout(View.java:11180)
09-26 16:45:45.561:E / AndroidRuntime(1121年):在android.view.ViewGroup.layout(ViewGroup.java:4203)
09-26 16:45:45.561:E / AndroidRuntime(1121年):在android.support.v4.widget.DrawerLayout.onLayout(DrawerLayout.java:672)
09-26 16:45:45.561:E / AndroidRuntime(1121年):在android.view.View.layout(View.java:11180)
09-26 16:45:45.561:E / AndroidRuntime(1121年):在android.view.ViewGroup.layout(ViewGroup.java:4203)
09-26 16:45:45.561:E / AndroidRuntime(1121年):在android.widget.FrameLayout.onLayout(FrameLayout.java:431)
09-26 16:45:45.561:E / AndroidRuntime(1121年):在android.view.View.layout(View.java:11180)
09-26 16:45:45.561:E / AndroidRuntime(1121年):在android.view.ViewGroup.layout(ViewGroup.java:4203)
09-26 16:45:45.561:E / AndroidRuntime(1121年):在android.widget.LinearLayout.setChildFrame(LinearLayout.java:1628)
09-26 16:45:45.561:E / AndroidRuntime(1121年):在android.widget.LinearLayout.layoutVertical(LinearLayout.java:1486)
09-26 16:45:45.561:E / AndroidRuntime(1121年):在android.widget.LinearLayout.onLayout(LinearLayout.java:1399)
09-26 16:45:45.561:E / AndroidRuntime(1121年):在android.view.View.layout(View.java:11180)
09-26 16:45:45.561:E / AndroidRuntime(1121年):在android.view.ViewGroup.layout(ViewGroup.java:4203)
09-26 16:45:45.561:E / AndroidRuntime(1121年):在android.widget.FrameLayout.onLayout(FrameLayout.java:431)
09-26 16:45:45.561:E / AndroidRuntime(1121年):在android.view.View.layout(View.java:11180)
09-26 16:45:45.561:E / AndroidRuntime(1121年):在android.view.ViewGroup.layout(ViewGroup.java:4203)
09-26 16:45:45.561:E / AndroidRuntime(1121年):在android.view.ViewRootImpl.performTraversals(ViewRootImpl.java:1468)
09-26 16:45:45.561:E / AndroidRuntime(1121年):在android.view.ViewRootImpl.handleMessage(ViewRootImpl.java:2418)
09-26 16:45:45.561:E / AndroidRuntime(1121年):在android.os.Handler.dispatchMessage(Handler.java:99)
09-26 16:45:45.561:E / AndroidRuntime(1121年):在android.os.Looper.loop(Looper.java:137)
09-26 16:45:45.561:E / AndroidRuntime(1121年):在android.app.ActivityThread.main(ActivityThread.java:4340)
09-26 16:45:45.561:E / AndroidRuntime(1121年):在java.lang.reflect.Method.invokeNative(本机方法)
09-26 16:45:45.561:E / AndroidRuntime(1121年):在java.lang.reflect.Method.invoke(Method.java:511)
09-26 16:45:45.561:E / AndroidRuntime(1121年):在com.android.internal.os.ZygoteInit $ MethodAndArgsCaller.run(ZygoteInit.java:784)
09-26 16:45:45.561:E / AndroidRuntime(1121年):在com.android.internal.os.ZygoteInit.main(ZygoteInit.java:551)
09-26 16:45:45.561:E / AndroidRuntime(1121年):在dalvik.system.NativeStart.main(本机方法)
09-26 16:45:45.593:D / dalvikvm(1121):GC_CONCURRENT释放191K,免费3%14296K / 14599K,暂停12毫秒+ 8ms的


解决方案

使用一个ViewHolder

http://developer.android.com/training/improving-布局/平滑scrolling.html

您getView改为

 公共查看getView(INT位置,查看convertView,父母的ViewGroup){    ViewHolder VH;
    如果(convertView == NULL)
    {
      VH =新ViewHolder();
      convertView = inflater.inflate(
                R.layout.drawer_list_item,父母,假);
      vh.txtTitle =(TextView中)convertView.findViewById(R.id.title);
      vh.txtSubtitle =(TextView中)convertView.findViewById(R.id.subtitle);
      vh.imgIcon =(ImageView的)convertView.findViewById(R.id.icon);        convertView.setTag(VH);
    }其他{
    VH =(ViewHolder)convertView.getTag();
    }
    vh.txtTitle.setText(标题[位置]);
    vh.txtSubtitle.setText(字幕[位置]);
    vh.imgIcon.setImageResource(图标[位置]);    返回convertView;
    }
静态类ViewHolder
{
TextView的txtTitle,txtSubtitle;
ImageView的imgIcon;
}

另外移动下面的构造。这个声明为一个类成员 LayoutInflater吹气

在你的构造

  =吹气(LayoutInflater)context.getSystemService(
                Context.LAYOUT_INFLATER_SERVICE);

编辑:

drawer_list_item.xml

修改

 的android:背景=机器人:彩色/ darker_gray

 的android:背景=@机器人:彩色/ darker_gray

I keep getting an InflateException upon trying to inflate a view in my MenuAdapter class. I've surrounded the troublesome code in a try-catch block and get the error Message:

link to the entire project:

https://docs.google.com/file/d/0B2Iwl4UysxOMa3E5a1l2SHZwOG8/edit?usp=sharing

Binary XML file line #1: Error inflating class

Here is the code:

package com.example.sidemenututorial;

import android.content.Context;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.BaseAdapter;
import android.widget.ImageView;
import android.widget.TextView;

public class MenuListAdapter extends BaseAdapter {

    // Fields -----------------------------------------------------------------
    private Context context;
    private String[] titles;
    private String[] subtitles;
    private int[] icons;
    private LayoutInflater inflater;

    // Constructor ------------------------------------------------------------
    public MenuListAdapter(
            Context context, 
            String[] titles, 
            String[] subtitles,
            int[] icons){
        this.context = context;
        this.titles = titles;
        this.subtitles = subtitles;
        this.icons = icons;
        inflater = (LayoutInflater)context.getSystemService(
                Context.LAYOUT_INFLATER_SERVICE);
    }

    // Accessors --------------------------------------------------------------
    @Override
    public int getCount(){
        return titles.length;
    }
    @Override
    public Object getItem(int position){
        return titles[position];
    }
    @Override
    public long getItemId(int position){
        return position;
    }

    // Methods ----------------------------------------------------------------
    public View getView(int position, View convertView, ViewGroup parent){

        ViewHolder viewHolder;

        // Only inflate the view if convertView is null
        if (convertView == null){
            viewHolder = new ViewHolder();
            convertView = inflater.inflate(
                    R.layout.drawer_list_item, parent, false);
            viewHolder.txtTitle = (TextView)convertView.findViewById(
                    R.id.title);
            viewHolder.txtSubtitle = (TextView)convertView.findViewById(
                    R.id.subtitle);
            viewHolder.imgIcon = (ImageView)convertView.findViewById(
                    R.id.icon);

            // This is the first time this view has been inflated,
            // so store the view holder in its tag fields
            convertView.setTag(viewHolder);
        } else {
            viewHolder = (ViewHolder)convertView.getTag();
        }

        // Set the views fields as needed
        viewHolder.txtTitle.setText(titles[position]);
        viewHolder.txtSubtitle.setText(subtitles[position]);
        viewHolder.imgIcon.setImageResource(icons[position]);

        return convertView;
    }

    // Classes ----------------------------------------------------------------
    static class ViewHolder {
        TextView txtTitle;
        TextView txtSubtitle;
        ImageView imgIcon;
    }

}

And here is the view it is trying to inflate, the drawer_list_item.xml:

        <LinearLayout 
        xmlns:android="http://schemas.android.com/apk/res/android"
            android:layout_width="match_parent"
            android:layout_height="match_parent"
            android:background="?android:color/darker_gray"
            android:orientation="horizontal"
            style="?attr/dropdownListPreferredItemHeight" >

        <ImageView
            android:id="@+id/icon"
            android:layout_width="wrap_content"
            android:layout_height="match_parent"
            android:adjustViewBounds="true"/>

        <LinearLayout
            android:layout_width="wrap_content"
            android:layout_height="match_parent"
            android:gravity="center_vertical|left"
            android:orientation="vertical">

            <TextView
                android:id="@+id/title"
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:ellipsize="end"
                android:singleLine="true"
                style="?attr/spinnerDropDownItemStyle"/>
            <TextView 
                android:id="@+id/subtitle"
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:ellipsize="end"
                android:singleLine="true"
                android:textAppearance="?attr/textAppearanceSmall"
                style="?attr/spinnerDropDownItemStyle"/>

        </LinearLayout>    

    </LinearLayout>

And here is the client code that is calling the menu adapter:

        package com.example.sidemenututorial;

    import android.content.res.Configuration;
    import android.os.Bundle;
    import android.support.v4.app.ActionBarDrawerToggle;
    import android.support.v4.app.Fragment;
    import android.support.v4.app.FragmentTransaction;
    import android.support.v4.view.GravityCompat;
    import android.support.v4.widget.DrawerLayout;
    import android.view.View;
    import android.widget.AdapterView;
    import android.widget.ListView;

    import com.actionbarsherlock.app.SherlockFragmentActivity;
    import com.actionbarsherlock.view.MenuItem;

    public class MainActivity extends SherlockFragmentActivity {

        // Fields -----------------------------------------------------------------
        private DrawerLayout drawerLayout;
        private ListView drawerList;
        private ActionBarDrawerToggle drawerToggle;
        private MenuListAdapter menuAdapter;
        private int[] icons;
        private Fragment fragment1;
        private Fragment fragment2;
        private Fragment fragment3;
        private CharSequence drawerTitle;
        private CharSequence title;
        private final String[] titles = new String[]{
                "Title Fragment #1",
                "Title Fragment #2",
                "Title Fragment #3"
        };
        private final String[] subtitles = new String[]{
                "Subtitle Fragment #1",
                "Subtitle Fragment #2",
                "Subtitle Fragment #3"
        };

        // Lifecycle Callbacks ----------------------------------------------------
        @Override
        protected void onCreate(Bundle savedInstanceState) {

            // Base implemenation
            super.onCreate(savedInstanceState);
            setContentView(R.layout.activity_main);

            // Instantiate the fragments
            fragment1 = new Fragment1();
            fragment2 = new Fragment2();
            fragment3 = new Fragment3();

            // Get the title from this activity
            title = drawerTitle = getTitle();

            // Get the icons from the drawables folder
            icons = new int[]{
                    R.drawable.action_about,
                    R.drawable.action_settings,
                    R.drawable.collections_cloud
            };

            // Get the drawer layout from the XML file and the ListView inside it
            drawerLayout = (DrawerLayout)findViewById(R.id.drawer_layout);
            drawerList = (ListView)findViewById(R.id.listview_drawer);

            // Set a custom shadow over that overlays the main content
            // when the drawer opens
            drawerLayout.setDrawerShadow(
                    R.drawable.drawer_shadow, GravityCompat.START);

            // Pass the string arrays to the MenuListAdapter, set the drawer
            // list adapter to it and set up its click listener
            menuAdapter = new MenuListAdapter(
                    MainActivity.this, titles, subtitles, icons);
            drawerList.setAdapter(menuAdapter);
            drawerList.setOnItemClickListener(new DrawerItemClickListener());

            // Enable the action bar to have up navigation
            getSupportActionBar().setHomeButtonEnabled(true);
            getSupportActionBar().setDisplayHomeAsUpEnabled(true);

            // Allow the the action bar to toggle the drawer
            drawerToggle = new ActionBarDrawerToggle(
                    this,
                    drawerLayout,
                    R.drawable.ic_drawer,
                    R.string.drawer_open,
                    R.string.drawer_close){

                public void onDrawerClosed(View view){
                    super.onDrawerClosed(view);
                }
                public void onDrawerOpened(View view){
                    getSupportActionBar().setTitle(drawerTitle);
                    super.onDrawerOpened(view);
                }
            };
            drawerLayout.setDrawerListener(drawerToggle);

            // If this is the first time opening this activity,
            // start with loading fragment #1
            if (savedInstanceState == null){
                selectItem(0);
            }       

        }

        // Methods ----------------------------------------------------------------
        @Override
        public boolean onOptionsItemSelected(MenuItem item){

            // If the user has pressed the action bar icon
            if (item.getItemId() == android.R.id.home){

                // If the drawer is open, close it; vice versa
                if (drawerLayout.isDrawerOpen(drawerList)){
                    drawerLayout.closeDrawer(drawerList);
                } else {
                    drawerLayout.openDrawer(drawerList);
                }
            }

            // Finish by letting the super class do the rest
            return super.onOptionsItemSelected(item);

        }
        @Override
        protected void onPostCreate(Bundle savedInstanceState){

            // Call the super implementation and synchronize the drawer
            super.onPostCreate(savedInstanceState);
            drawerToggle.syncState();

        }
        @Override
        public void onConfigurationChanged(Configuration newConfig){

            // Call the super implemenation on this activity
            // and the drawer toggle object
            super.onConfigurationChanged(newConfig);
            drawerToggle.onConfigurationChanged(newConfig);

        }
        private void selectItem(int position){

            // Create a new fragment transaction and start it
            FragmentTransaction fragTran = getSupportFragmentManager()
                                           .beginTransaction();

            // Locate the position selected replace the content view
            // with the fragment of the number selected
            switch (position){
                case 0:{
                    fragTran.replace(R.id.content_frame, fragment1);
                    break;
                }
                case 1:{
                    fragTran.replace(R.id.content_frame, fragment2);
                    break;
                }
                case 2:{
                    fragTran.replace(R.id.content_frame, fragment3);
                    break;
                }
            }

            // Commit the transaction and close the drawer
            fragTran.commit();
            drawerList.setItemChecked(position, true);
            drawerLayout.closeDrawer(drawerList);

        }
        public void setTitle(CharSequence title){

            // Save the passed in title and set the action bar title
            this.title = title;
            getSupportActionBar().setTitle(title);

        }

        // Classes ----------------------------------------------------------------
        private class DrawerItemClickListener 
        implements ListView.OnItemClickListener{

            @Override
            public void onItemClick(
                    AdapterView<?> parent, 
                    View view, 
                    int position,
                    long id) {

                // When clicked, select open the appropriate fragment
                selectItem(position);

            }

        }

    }

And a log of the crash:

09-26 16:45:43.081: D/AndroidRuntime(1121): Shutting down VM
09-26 16:45:43.081: W/dalvikvm(1121): threadid=1: thread exiting with uncaught exception (group=0x409961f8)
09-26 16:45:45.561: E/AndroidRuntime(1121): FATAL EXCEPTION: main
09-26 16:45:45.561: E/AndroidRuntime(1121): java.lang.NullPointerException
09-26 16:45:45.561: E/AndroidRuntime(1121):     at com.example.sidemenututorial.MenuListAdapter.getView(MenuListAdapter.java:73)
09-26 16:45:45.561: E/AndroidRuntime(1121):     at android.widget.AbsListView.obtainView(AbsListView.java:2033)
09-26 16:45:45.561: E/AndroidRuntime(1121):     at android.widget.ListView.makeAndAddView(ListView.java:1772)
09-26 16:45:45.561: E/AndroidRuntime(1121):     at android.widget.ListView.fillDown(ListView.java:672)
09-26 16:45:45.561: E/AndroidRuntime(1121):     at android.widget.ListView.fillFromTop(ListView.java:732)
09-26 16:45:45.561: E/AndroidRuntime(1121):     at android.widget.ListView.layoutChildren(ListView.java:1625)
09-26 16:45:45.561: E/AndroidRuntime(1121):     at android.widget.AbsListView.onLayout(AbsListView.java:1863)
09-26 16:45:45.561: E/AndroidRuntime(1121):     at android.view.View.layout(View.java:11180)
09-26 16:45:45.561: E/AndroidRuntime(1121):     at android.view.ViewGroup.layout(ViewGroup.java:4203)
09-26 16:45:45.561: E/AndroidRuntime(1121):     at android.support.v4.widget.DrawerLayout.onLayout(DrawerLayout.java:672)
09-26 16:45:45.561: E/AndroidRuntime(1121):     at android.view.View.layout(View.java:11180)
09-26 16:45:45.561: E/AndroidRuntime(1121):     at android.view.ViewGroup.layout(ViewGroup.java:4203)
09-26 16:45:45.561: E/AndroidRuntime(1121):     at android.widget.FrameLayout.onLayout(FrameLayout.java:431)
09-26 16:45:45.561: E/AndroidRuntime(1121):     at android.view.View.layout(View.java:11180)
09-26 16:45:45.561: E/AndroidRuntime(1121):     at android.view.ViewGroup.layout(ViewGroup.java:4203)
09-26 16:45:45.561: E/AndroidRuntime(1121):     at android.widget.LinearLayout.setChildFrame(LinearLayout.java:1628)
09-26 16:45:45.561: E/AndroidRuntime(1121):     at android.widget.LinearLayout.layoutVertical(LinearLayout.java:1486)
09-26 16:45:45.561: E/AndroidRuntime(1121):     at android.widget.LinearLayout.onLayout(LinearLayout.java:1399)
09-26 16:45:45.561: E/AndroidRuntime(1121):     at android.view.View.layout(View.java:11180)
09-26 16:45:45.561: E/AndroidRuntime(1121):     at android.view.ViewGroup.layout(ViewGroup.java:4203)
09-26 16:45:45.561: E/AndroidRuntime(1121):     at android.widget.FrameLayout.onLayout(FrameLayout.java:431)
09-26 16:45:45.561: E/AndroidRuntime(1121):     at android.view.View.layout(View.java:11180)
09-26 16:45:45.561: E/AndroidRuntime(1121):     at android.view.ViewGroup.layout(ViewGroup.java:4203)
09-26 16:45:45.561: E/AndroidRuntime(1121):     at android.view.ViewRootImpl.performTraversals(ViewRootImpl.java:1468)
09-26 16:45:45.561: E/AndroidRuntime(1121):     at android.view.ViewRootImpl.handleMessage(ViewRootImpl.java:2418)
09-26 16:45:45.561: E/AndroidRuntime(1121):     at android.os.Handler.dispatchMessage(Handler.java:99)
09-26 16:45:45.561: E/AndroidRuntime(1121):     at android.os.Looper.loop(Looper.java:137)
09-26 16:45:45.561: E/AndroidRuntime(1121):     at android.app.ActivityThread.main(ActivityThread.java:4340)
09-26 16:45:45.561: E/AndroidRuntime(1121):     at java.lang.reflect.Method.invokeNative(Native Method)
09-26 16:45:45.561: E/AndroidRuntime(1121):     at java.lang.reflect.Method.invoke(Method.java:511)
09-26 16:45:45.561: E/AndroidRuntime(1121):     at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:784)
09-26 16:45:45.561: E/AndroidRuntime(1121):     at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:551)
09-26 16:45:45.561: E/AndroidRuntime(1121):     at dalvik.system.NativeStart.main(Native Method)
09-26 16:45:45.593: D/dalvikvm(1121): GC_CONCURRENT freed 191K, 3% free 14296K/14599K, paused 12ms+8ms

解决方案

Use a ViewHolder

http://developer.android.com/training/improving-layouts/smooth-scrolling.html

Change your getView to

public View getView(int position, View convertView, ViewGroup parent){

    ViewHolder vh;
    if(convertView==null)
    {
      vh = new ViewHolder();
      convertView = inflater.inflate(
                R.layout.drawer_list_item, parent, false);  
      vh.txtTitle = (TextView) convertView.findViewById(R.id.title);
      vh.txtSubtitle = (TextView) convertView.findViewById(R.id.subtitle);
      vh.imgIcon = (ImageView) convertView.findViewById(R.id.icon); 

        convertView.setTag(vh); 
    } else { 
    vh = (ViewHolder) convertView.getTag(); 
    } 
    vh.txtTitle.setText(titles[position]);
    vh.txtSubtitle.setText(subtitles[position]);
    vh.imgIcon.setImageResource(icons[position]);

    return convertView;
    }
static class ViewHolder
{
TextView txtTitle,txtSubtitle;
ImageView imgIcon;
}

Also move the below to constructor. Declare this as a class member LayoutInflater inflater

In your constructor

   inflater = (LayoutInflater)context.getSystemService(
                Context.LAYOUT_INFLATER_SERVICE);

Edit:

In drawer_list_item.xml

Change

 android:background="?android:color/darker_gray" 

to

android:background="@android:color/darker_gray"

这篇关于InflateException上inflater.inflate()方法调用的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆