benoffi7
benoffi7

Reputation: 3106

Navigation drawer icons are missing

My app currently has a strange behavior

When I run for the first time is ok, but after a few clicks, the navigation drawer icons dissapear.

enter image description here

enter image description here

My code

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

            mTitle = mDrawerTitle = getTitle();
            menu_array = getResources().getStringArray(R.array.menu_array);


            GCMRegistrar.checkDevice(MainActivity.this);
            GCMRegistrar.checkManifest(MainActivity.this);

            final String regId = GCMRegistrar.getRegistrationId(MainActivity.this);
            if (regId.equals(""))
            {
                GCMRegistrar.register(MainActivity.this, SENDER_ID);
            }
            else
            {
                Log.v("GCMTest", "Ya registrado");
            }

            setDrawer();

            getActionBar().setDisplayHomeAsUpEnabled(true);
            getActionBar().setHomeButtonEnabled(true);

            mDrawerToggle = new ActionBarDrawerToggle(this, mDrawerLayout, R.drawable.ic_navigation_drawer, R.string.drawer_open, R.string.drawer_close)
            {
                public void onDrawerClosed(View view)
                {
                    getActionBar().setTitle(mTitle);
                    invalidateOptionsMenu();
                }

                public void onDrawerOpened(View drawerView)
                {
                    getActionBar().setTitle(mDrawerTitle);
                    invalidateOptionsMenu();
                }
            };

            mDrawerLayout.setDrawerListener(mDrawerToggle);

            if (savedInstanceState == null)
            {
                selectItem(0);
            }
        }


private void setDrawer()
    {
        mDrawerLayout = (DrawerLayout) findViewById(R.id.drawer_layout);
        mDrawerList = (ListView) findViewById(R.id.left_drawer);

        mDrawerLayout.setDrawerShadow(R.drawable.drawer_shadow, GravityCompat.START);

        mDrawerList.setAdapter(new CustomDrawerAdapter(this, R.layout.drawer_list_item, menu_array));
        mDrawerList.setOnItemClickListener(new DrawerItemClickListener());
    }

public class CustomDrawerAdapter extends ArrayAdapter<DrawerItem>
{

    Context context;
    String[] drawerItemList;
    int layoutResID;
    private TypedArray imgs;

    public CustomDrawerAdapter(Context context, int layoutResourceID, String[] listItems)
    {
        super(context, layoutResourceID);
        this.context = context;
        this.drawerItemList = listItems;
        this.layoutResID = layoutResourceID;
        imgs = context.getResources().obtainTypedArray(R.array.random_imgs);
    }

    @Override
    public int getCount()
    {
        return drawerItemList.length;
    }

    @Override
    public View getView(int position, View convertView, ViewGroup parent)
    {
        // TODO Auto-generated method stub

        DrawerItemHolder drawerHolder;
        View view = convertView;

        if (view == null)
        {
            LayoutInflater inflater = ((Activity) context).getLayoutInflater();
            drawerHolder = new DrawerItemHolder();

            view = inflater.inflate(layoutResID, parent, false);
            drawerHolder.ItemName = (TextView) view.findViewById(R.id.text1);
            drawerHolder.icon = (ImageView) view.findViewById(R.id.imageView1);

            view.setTag(drawerHolder);

        }
        else
        {
            drawerHolder = (DrawerItemHolder) view.getTag();

        }


        drawerHolder.icon.setImageResource(imgs.getResourceId(position, -1));
        drawerHolder.ItemName.setText(drawerItemList[position]);
        imgs.recycle();
        return view;
    }

    private static class DrawerItemHolder
    {
        TextView ItemName;
        ImageView icon;
    }
}


<string-array name="menu_array">
        <item>Puntos de carga</item>
        <item>Mi SUBE</item>
        <item>Configuración</item>
        <item>Acerca de</item>
    </string-array>
    <string-array name="random_imgs">
        <item>@drawable/menu_puntos</item>
        <item>@drawable/ic_card</item>
        <item>@drawable/user</item>
        <item>@drawable/menu_acerca</item>
    </string-array>

Thanks for the help!!!!

Upvotes: 0

Views: 91

Answers (1)

madlymad
madlymad

Reputation: 6530

The problems is the way you are setting/saving/recycle the images:

With this line imgs = context.getResources().obtainTypedArray(R.array.random_imgs); you load the images so to the TypedArray so it is possible for them to appear. But as soon as the imgs.recycle(); run all of them are recycled and stop appearing.

So a suggestion would be to initialize them to another int array and recycle safely the TypedArray.

Change lines:

  1. private TypedArray imgs; to private int imgs [];

  2. imgs = context.getResources().obtainTypedArray(R.array.random_imgs); to
    imgs = initializeImages();

  3. drawerHolder.icon.setImageResource(imgs.getResourceId(position, -1)); to drawerHolder.icon.setImageResource(imgs[position]);

  4. delete completely imgs.recycle();

  5. Add this method:

    private int[] initializeImages() {
       TypedArray ar = context.getResources().obtainTypedArray(R.array.random_imgs);
       int len = ar.length();
       int[] resIds = new int[len];
       for (int i = 0; i < len; i++) {
          resIds[i] = ar.getResourceId(i, 0);
       } 
       ar.recycle();
       return resIds;
    }
    
  6. The xml string-array should remain as is.


Another option would be to set the drawables in java code and not an array xml.

eg.

private int imgs [] = {R.drawable.menu_puntos,
     R.drawable.ic_card, 
     R.drawable.user, 
     R.drawable.menu_acerca 
    }; 

Upvotes: 1

Related Questions