2017-11-21 18 views
0

私はメニューを含む引き出しのレイアウトを持っています。私はmainActivity.javaファイルの最初のメニュー項目をデフォルトのものとして選択しました。その後、以前にチェックされたメニュー項目をチェック項目として削除し、新しく選択したメニュー項目をチェック項目として設定するために、previousItemという名前のint変数を使用してコードを書きました。しかし、私はIndexOutOfBounds例外を取得し続け、この問題の回避策を見つける方法がわかりません。引き出しのメニューのチェックとチェックを外す

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

例外:あなたはアイテムIDの代わりに、メニュー内の項目の位置を使用している

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) 

答えて

0

私は私のmainActivity.javaファイルやログを掲示しています。 あなたは、このコード行使用してメニュー項目の位置を見つけることができます:あなたのコードでint position=items.indexOf(menuItem);

を:

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

私は本当にあなたの答えを理解していない、それは短すぎるとdoesnのですあまり説明しません。始めるべき項目は何ですか? –

+1

あなたのonNavigationItemSelected() で、 'previousItem = items.indexOf(menuItem) 'を使ってアイテムの位置を保存してください – dalla92

+1

残念ですが、下部に参照リンクがありませんでした。それで解決しました、ありがとう! –

関連する問題