InflateException en la llamada al método inflater.inflate ()

Sigo recibiendo una InflateException al intentar inflar una vista en mi clase MenuAdapter . He rodeado el código problemático en un bloque try-catch y obtener el mensaje de error:

Enlace a todo el proyecto:

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

Línea de archivo XML binario # 1: Error al inflacionar la clase

Aquí está el código:

 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> 

Y aquí está el código de cliente que está llamando al adaptador de menú:

  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); } } } 

Y un registro del accidente:

 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 

Usar un ViewHolder

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

Cambia tu getView a

 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; } 

También mueva el siguiente al constructor. Declare esto como un miembro de la clase LayoutInflater inflater

En su constructor

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

Editar:

En drawer_list_item.xml

Cambio

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

a

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

Cuando u obtener Error inflar su clase que tiene que buscar el problema en su XML en primer lugar.

En su caso, el problema está en su diseño de archivo_dibujo_dibujo. En su raíz linearLayout, el carácter " ? " Lo causa con la fila android: background = "? Android: color / darker_gray" .

  • El cajón de navegación se cierra al hacer clic
  • Cajón de navegación con la actividad y el niño Fragmentos
  • Empuje la actividad a la derecha cuando el cajón abierto
  • Elementos del menú de NavigationView con el contador a la derecha
  • Android - Cómo cambiar fragmentos en el cajón de navegación
  • Cerrar Gaveta de navegación sin animación
  • Android: 2 o más ExpandableListView dentro del Gaveta de navegación
  • ¿Cómo crear un cajón de navegación personalizado que abre ListView junto al cajón onitemclick?
  • Gestor de navegación Android mejores prácticas
  • Eliminación del margen izquierdo del ícono de navegación de Android
  • Administrar la barra de herramientas y el botón de retroceso del fragmento en android
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.