2017-11-21 12 views
0

Ich habe ein Schubladenlayout, das ein Menü enthält, und habe den ersten Menüeintrag als den standardmäßig ausgewählten Eintrag in meiner Datei mainActivity.java festgelegt. Nachdem ich das getan habe, habe ich Code geschrieben, der eine int-Variable mit dem Namen previousItem verwendet, um den zuvor überprüften Menüeintrag als überprüfter Eintrag entfernen zu können und den neu ausgewählten Menüpunkt als überprüften zu setzen. Ich bekomme jedoch weiterhin eine IndexOutOfBounds Exception und ich weiß nicht, wie ich eine Lösung für dieses Problem finden kann. Ich poste meine mainActivity.java Datei und das Protokoll:Aktivieren und Deaktivieren von Elementen im Menü "Schublade"

public class MainActivity extends AppCompatActivity { 

int previousItem; 

// Declaring our dialog 
ImportantDialogFragment dialogFragment = new ImportantDialogFragment(); 

GridView gridView; 

// NavMenu member vars 
private DrawerLayout mDrawerLayout; 
private NavigationView navigationView; 
private ActionBarDrawerToggle mToggle; // Button for toggling the side menu 

private Toolbar mToolbar; 

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

    // Showing the disclaimer dialog every time the app starts 
    dialogFragment.show(getSupportFragmentManager(),"IMPORTANT_NOTICE"); 

    // Get Screen Size Details 
    DisplayMetrics displayMetrics = new DisplayMetrics(); 
    getWindowManager().getDefaultDisplay().getMetrics(displayMetrics); 
    int height = displayMetrics.heightPixels; 
    final int width = displayMetrics.widthPixels; 

    gridView = (GridView) findViewById(R.id.gridViewLayout); 
    gridView.setAdapter(new ImageAdapter(this)); // used to set the contents of the GridView-in this case images- 

    // When an item from the GridView gets clicked 
    gridView.setOnItemClickListener(new AdapterView.OnItemClickListener() { 
     @Override 
     public void onItemClick(AdapterView<?> parent, View view, int position, long id) { 
      // Create a new Intent... 
      Toast.makeText(MainActivity.this, "Position: " + position, Toast.LENGTH_SHORT).show(); 
      Intent intent = new Intent(MainActivity.this,CardViewActivity.class); 
      intent.putExtra("Card Index",position); 
      intent.putExtra("SCREEN_WIDTH",width); 
      startActivity(intent); 
     } 
    }); 

    mToolbar = (Toolbar) findViewById(R.id.navActionBar); 
    setSupportActionBar(mToolbar); // check quick doq 
    getSupportActionBar().setDisplayShowTitleEnabled(false); 
    mToolbar.setTitle(""); 
    getSupportActionBar().setDisplayHomeAsUpEnabled(true); 

    mDrawerLayout = (DrawerLayout) findViewById(R.id.drawerLayout); 
    mToggle = new ActionBarDrawerToggle(this,mDrawerLayout,R.string.drawer_open,R.string.drawer_closed); // Instantiating our button 

    navigationView = (NavigationView) findViewById(R.id.nav_view); 

    // Sets the default selected menu item, to the Home item 
    navigationView.getMenu().findItem(R.id.nav_home).setChecked(true); 
    previousItem = navigationView.getMenu().getItem(0).getItemId(); 

    // When an item inside the NavView gets clicked, then handle the event... 
    navigationView.setNavigationItemSelectedListener(new NavigationView.OnNavigationItemSelectedListener() { 

     @Override 
     public boolean onNavigationItemSelected(@NonNull MenuItem item) { 

      switch (item.getItemId()) { 
       case R.id.nav_home: 
        mDrawerLayout.closeDrawer(Gravity.START); 
        break; 
       case R.id.nav_UserBoxGLB: 
        // USERBOX GLB ACTIVITY 
        Intent userBoxGLBintent = new Intent(MainActivity.this,UserBoxGLBActivity.class); 
        startActivity(userBoxGLBintent); 
        break; 
       case R.id.nav_UserBoxJP: 
        break; 
       case R.id.nav_settings: 
        break; 
       case R.id.nav_feedback: 
        break; 
       case R.id.nav_contact_us: 
        break; 
       case R.id.nav_donate: 
        // Open the website's URL in a browser window 
        Intent intent = new Intent(); 
        intent.setAction(Intent.ACTION_VIEW); 
        intent.addCategory(Intent.CATEGORY_BROWSABLE); 
        intent.setData(Uri.parse("http://www.google.com")); 
        startActivity(intent); 
        break; 
       case R.id.nav_about: 
        break; 
       default: 
        return onNavigationItemSelected(item); 
      } 
      navigationView.getMenu().getItem(previousItem).setChecked(false); 
      item.setChecked(true); 
      previousItem = navigationView.getMenu().findItem(item.getItemId()).getItemId(); 
      mDrawerLayout.closeDrawers(); 
      return false; 
     } 
    }); 

    mDrawerLayout.addDrawerListener(mToggle); 
    mToggle.syncState(); 
} 



// When an item from the Action Bar gets tapped, then... 
@Override 
public boolean onOptionsItemSelected(MenuItem item) { 

    if(mToggle.onOptionsItemSelected(item)) { 
     return true; 
    } 
    return onOptionsItemSelected(item); 
} 
} 

Ausnahme:

11-21 14:27:45.553 19074-19074/com.dcv.spdesigns.dokkancards E/AndroidRuntime: FATAL EXCEPTION: main 
                      Process: com.dcv.spdesigns.dokkancards, PID: 19074 
                      java.lang.IndexOutOfBoundsException: Index: 2131230840, Size: 5 
                       at java.util.ArrayList.get(ArrayList.java:411) 
                       at android.support.v7.view.menu.MenuBuilder.getItem(MenuBuilder.java:741) 
                       at com.dcv.spdesigns.dokkancards.MainActivity$2.onNavigationItemSelected(MainActivity.java:122) 
                       at android.support.design.widget.NavigationView$1.onMenuItemSelected(NavigationView.java:154) 
                       at android.support.v7.view.menu.MenuBuilder.dispatchMenuItemSelected(MenuBuilder.java:822) 
                       at android.support.v7.view.menu.MenuItemImpl.invoke(MenuItemImpl.java:171) 
                       at android.support.v7.view.menu.MenuBuilder.performItemAction(MenuBuilder.java:973) 
                       at android.support.design.internal.NavigationMenuPresenter$1.onClick(NavigationMenuPresenter.java:342) 
                       at android.view.View.performClick(View.java:6261) 
                       at android.view.View$PerformClick.run(View.java:23748) 
                       at android.os.Handler.handleCallback(Handler.java:751) 
                       at android.os.Handler.dispatchMessage(Handler.java:95) 
                       at android.os.Looper.loop(Looper.java:154) 
                       at android.app.ActivityThread.main(ActivityThread.java:6776) 
                       at java.lang.reflect.Method.invoke(Native Method) 
                       at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:1520) 
                       at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1410) 

Antwort

0

Sie verwenden die Artikel-ID anstelle der Artikel Position innerhalb des Menüs. Sie können die Position der Menüpunkte mit dieser Codezeile finden: int position=items.indexOf(menuItem);

In Ihrem Code:

final List<MenuItem> items=new ArrayList<>(); 
for(int i=0; i<menu.size(); i++){ 
    items.add(menu.getItem(i)); 
} 
... 
navigationView.setNavigationItemSelectedListener(new NavigationView.OnNavigationItemSelectedListener() { 

    @Override 
    public boolean onNavigationItemSelected(@NonNull MenuItem item) { 
     ... 
     navigationView.getMenu().getItem(previousItem).setChecked(false); 
     item.setChecked(true); 
     previousItem = items.indexOf(navigationView.getMenu().findItem(item.getItemId())); 
... 
} 

Reference

+0

Ich verstehe nicht wirklich die Antwort, es ist zu kurz und doesn‘ Ich erkläre viel. Mit welchen Gegenständen beginnen Sie? –

+1

In Ihrer onNavigationItemSelected() sollten Sie die Position des Elements mit 'previousItem = items.indexOf (menuItem) 'speichern. – dalla92

+1

Sorry, aber ich hatte nicht den Verweis-Link auf der Unterseite. Das hat es gelöst, vielen Dank! –

Verwandte Themen