Reputation: 333
I tried to add a new block of items and I got error and I deleted the whole codes for the new block but I'm still getting this error. Can someone help me please to fix the error and add a new block of items to my sliding menu, please?
Here is my MainActivity.java:
package com.orar.cngcnasaud;
import android.app.Activity;
import android.content.Intent;
import android.content.res.Configuration;
import android.graphics.Color;
import android.media.MediaPlayer;
import android.os.Bundle;
import android.support.v4.app.ActionBarDrawerToggle;
import android.support.v4.view.GravityCompat;
import android.support.v4.widget.DrawerLayout;
import android.util.Log;
import android.view.MenuItem;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.AdapterView;
import android.widget.Button;
import android.widget.ListView;
public class MainActivity extends Activity implements OnClickListener {
private ListView mDrawerList;
private DrawerLayout mDrawer;
private CustomActionBarDrawerToggle mDrawerToggle;
private String[] menuItems;
private static final String TAG = "AudioDemo";
private static final String isPlaying = "Media is Playing";
private static final String notPlaying = "Media has stopped Playing";
MediaPlayer player;
Button playerButton;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main_drawer);
player = MediaPlayer.create(this, R.raw.gc);
player.setLooping(false); // Set looping
// Get the button from the view
playerButton = (Button) this.findViewById(R.id.buttonmp);
playerButton.setText(R.string.play_label);
playerButton.setTextColor(Color.WHITE);
playerButton.setOnClickListener((OnClickListener) this);
// enable ActionBar app icon to behave as action to toggle nav drawer
getActionBar().setDisplayHomeAsUpEnabled(true);
getActionBar().setHomeButtonEnabled(true);
mDrawer = (DrawerLayout) findViewById(R.id.drawer_layout);
// set a custom shadow that overlays the main content when the drawer
// opens
mDrawer.setDrawerShadow(R.drawable.drawer_shadow, GravityCompat.START);
_initMenu();
mDrawerToggle = new CustomActionBarDrawerToggle(this, mDrawer);
mDrawer.setDrawerListener(mDrawerToggle);
}
public void onClick(View v) {
Log.d(TAG, "onClick: " + v);
if (v.getId() == R.id.buttonmp) {
playPause();
}
}
private void demoPause() {
// TODO Auto-generated method stub
player.pause();
playerButton.setText(R.string.play_label);
Log.d(TAG, notPlaying);
}
private void playPause() {
// TODO Auto-generated method stub
if(player.isPlaying()) {
demoPause();
} else {
demoPlay();
}
}
private void demoPlay() {
// TODO Auto-generated method stub
player.start();
playerButton.setText(R.string.stop_label);
Log.d(TAG, isPlaying);
}
private void _initMenu() {
NsMenuAdapter mAdapter = new NsMenuAdapter(this);
// Add Header
mAdapter.addHeader(R.string.ns_menu_main_header);
// Add first block
menuItems = getResources().getStringArray(
R.array.ns_menu_items);
String[] menuItemsIcon = getResources().getStringArray(
R.array.ns_menu_items_icon);
int res = 0;
for (String item : menuItems) {
int id_title = getResources().getIdentifier(item, "string",
this.getPackageName());
int id_icon = getResources().getIdentifier(menuItemsIcon[res],
"drawable", this.getPackageName());
NsMenuItemModel mItem = new NsMenuItemModel(id_title, id_icon);
if (res==1) mItem.counter=0; //it is just an example...
if (res==3) mItem.counter=0; //it is just an example...
mAdapter.addItem(mItem);
res++;
}
mDrawerList = (ListView) findViewById(R.id.drawer);
if (mDrawerList != null)
mDrawerList.setAdapter(mAdapter);
mDrawerList.setOnItemClickListener(new DrawerItemClickListener());
}
@Override
protected void onPostCreate(Bundle savedInstanceState) {
super.onPostCreate(savedInstanceState);
// Sync the toggle state after onRestoreInstanceState has occurred.
mDrawerToggle.syncState();
}
@Override
public void onConfigurationChanged(Configuration newConfig) {
super.onConfigurationChanged(newConfig);
mDrawerToggle.onConfigurationChanged(newConfig);
}
@Override
public boolean onOptionsItemSelected(MenuItem item) {
/*
* The action bar home/up should open or close the drawer.
* ActionBarDrawerToggle will take care of this.
*/
if (mDrawerToggle.onOptionsItemSelected(item)) {
return true;
}
// Handle your other action bar items...
return super.onOptionsItemSelected(item);
}
private class CustomActionBarDrawerToggle extends ActionBarDrawerToggle {
public CustomActionBarDrawerToggle(Activity mActivity,DrawerLayout mDrawerLayout){
super(
mActivity,
mDrawerLayout,
R.drawable.ic_drawer,
R.string.ns_menu_open,
R.string.ns_menu_close);
}
@Override
public void onDrawerClosed(View view) {
getActionBar().setTitle(getString(R.string.ns_menu_close));
invalidateOptionsMenu(); // creates call to onPrepareOptionsMenu()
}
@Override
public void onDrawerOpened(View drawerView) {
getActionBar().setTitle(getString(R.string.ns_menu_open));
invalidateOptionsMenu(); // creates call to onPrepareOptionsMenu()
}
}
private class DrawerItemClickListener implements ListView.OnItemClickListener {
@Override
public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
mDrawerList.setItemChecked(position, true);
mDrawer.closeDrawer(mDrawerList);
if (position == 1) {
Intent intent = new Intent(MainActivity.this, Istoric.class);
startActivity(intent);
mDrawer.closeDrawers();
}
else if (position == 2) {
Intent intent2 = new Intent(MainActivity.this, Profesori.class);
startActivity(intent2);
mDrawer.closeDrawers();
}
if (position == 3) {
Intent intent3 = new Intent(MainActivity.this, Elevi.class);
startActivity(intent3);
mDrawer.closeDrawers();
}
if (position == 4) {
Intent intent4 = new Intent(MainActivity.this, ShowImageActivity.class);
startActivity(intent4);
mDrawer.closeDrawers();
}
if (position == 5) {
Intent intent5 = new Intent(MainActivity.this, Despre.class);
startActivity(intent5);
mDrawer.closeDrawers();
}
if (position == 6) {
Intent intent6 = new Intent(MainActivity.this, Feedback.class);
startActivity(intent6);
mDrawer.closeDrawers();
}
}
}
}
And here is my logcat:
02-26 19:00:15.198: E/AndroidRuntime(1308): FATAL EXCEPTION: main
02-26 19:00:15.198: E/AndroidRuntime(1308): java.lang.RuntimeException: Unable to start activity ComponentInfo{com.orar.cngcnasaud/com.orar.cngcnasaud.MainActivity}: java.lang.ArrayIndexOutOfBoundsException: length=4; index=4
02-26 19:00:15.198: E/AndroidRuntime(1308): at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2180)
02-26 19:00:15.198: E/AndroidRuntime(1308): at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2230)
02-26 19:00:15.198: E/AndroidRuntime(1308): at android.app.ActivityThread.access$600(ActivityThread.java:141)
02-26 19:00:15.198: E/AndroidRuntime(1308): at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1234)
02-26 19:00:15.198: E/AndroidRuntime(1308): at android.os.Handler.dispatchMessage(Handler.java:99)
02-26 19:00:15.198: E/AndroidRuntime(1308): at android.os.Looper.loop(Looper.java:137)
02-26 19:00:15.198: E/AndroidRuntime(1308): at android.app.ActivityThread.main(ActivityThread.java:5041)
02-26 19:00:15.198: E/AndroidRuntime(1308): at java.lang.reflect.Method.invokeNative(Native Method)
02-26 19:00:15.198: E/AndroidRuntime(1308): at java.lang.reflect.Method.invoke(Method.java:511)
02-26 19:00:15.198: E/AndroidRuntime(1308): at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:793)
02-26 19:00:15.198: E/AndroidRuntime(1308): at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:560)
02-26 19:00:15.198: E/AndroidRuntime(1308): at dalvik.system.NativeStart.main(Native Method)
02-26 19:00:15.198: E/AndroidRuntime(1308): Caused by: java.lang.ArrayIndexOutOfBoundsException: length=4; index=4
02-26 19:00:15.198: E/AndroidRuntime(1308): at com.orar.cngcnasaud.MainActivity._initMenu(MainActivity.java:126)
02-26 19:00:15.198: E/AndroidRuntime(1308): at com.orar.cngcnasaud.MainActivity.onCreate(MainActivity.java:64)
02-26 19:00:15.198: E/AndroidRuntime(1308): at android.app.Activity.performCreate(Activity.java:5104)
02-26 19:00:15.198: E/AndroidRuntime(1308): at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1080)
02-26 19:00:15.198: E/AndroidRuntime(1308): at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2144)
02-26 19:00:15.198: E/AndroidRuntime(1308): ... 11 more
Thanks a lot !
Upvotes: 0
Views: 1536
Reputation: 8598
ArrayIndexOutOfBoundsException is thrown, because you are accessing an array item at index 4, but your array (menuItemsIcon) contains only 4 elements.
You have 2 arrays: menuItems
and menuItemsIcon
, and in your for loop
you are using an enhanced version of it to iterate through menuItems
, AT THE SAME TIME, you are using res to access menuItemsIcon elements, which you increment in your for loop
. Now, there are less elements in menuItemsIcon
array (it's length is 4), so when trying to access element at index 4, you get your exception.
You have few options to fix this:
for loop
body, and use index to access the longer array - of course, this is not ideal, as you won't be using all elements of the longer arrayUpvotes: 0
Reputation: 11321
I think your code can be fixed like this:
int res = 0;
for (String item : menuItems) {
int id_title = getResources().getIdentifier(item, "string",
this.getPackageName());
if (res < menuItemsIcon.length) { //only if the array is big enough..
int id_icon = getResources().getIdentifier(menuItemsIcon[res],
"drawable", this.getPackageName());
}
NsMenuItemModel mItem = new NsMenuItemModel(id_title, id_icon);
if (res==1) mItem.counter=0; //it is just an example...
if (res==3) mItem.counter=0; //it is just an example...
mAdapter.addItem(mItem);
res++;
}
Edit: corrected the res-1
thing an add check for array length instead...
Upvotes: 1
Reputation: 148
At line 126 (within _initMenu()), your loop is calling an index outside of the array. An array of length 4 should contain indexes of 0,1,2,3.
02-26 19:00:15.198: E/AndroidRuntime(1308): Caused by: java.lang.ArrayIndexOutOfBoundsException: length=4; index=4 02-26 19:00:15.198: E/AndroidRuntime(1308): at com.orar.cngcnasaud .MainActivity._initMenu(MainActivity.java:126)
Upvotes: 2