Reputation: 3106
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.
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
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:
private TypedArray imgs;
to private int imgs [];
imgs = context.getResources().obtainTypedArray(R.array.random_imgs);
to
imgs = initializeImages();
drawerHolder.icon.setImageResource(imgs.getResourceId(position, -1));
to
drawerHolder.icon.setImageResource(imgs[position]);
delete completely imgs.recycle();
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;
}
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