1

NavigationViewでActionBarDrawerToggleを使用しています。私のコンテンツは断片を使って表示されます。AppCompatActivityとツールバーを含むActionBarDrawerToggleフラグメント付きの戻るボタン

私はthis stackoverflow questionに従っているため、戻るボタンを押しても操作はできますが、制御は決してonOptionsItemSelectedに流れません。 Toolbarからクリック -

@Override 
protected void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    toolbar = (Toolbar) findViewById(R.id.toolbar); 
    setSupportActionBar(toolbar); 

    mDrawerLayout = (DrawerLayout) findViewById(R.id.drawer_layout); 
    mDrawerToggle = new ActionBarDrawerToggle(this, mDrawerLayout, toolbar, R.string.openDrawerContentDescRes, R.string.closeDrawerContentDescRes); 
    mDrawerLayout.addDrawerListener(mDrawerToggle); 
    mDrawerToggle.syncState(); 

@Override 
public void onBackPressed() { 
    if (getFragmentManager().getBackStackEntryCount() == 0) { 
     super.onBackPressed(); 
    } else { 
     removeFragmentFromBackstack(); 
     updateToolbarWithHomeButton(); 
    } 

} 

@Override 
public boolean onOptionsItemSelected(MenuItem item) { 
    if (mDrawerToggle.onOptionsItemSelected(item)) { 
     return true; 
    } 

    switch (item.getItemId()) { 
     case android.R.id.home: 
      // doesn't reach here ever. 
      return true; 
     case R.id.action_x: 
      // do something 
      return true; 
     case R.id.action_y: 
      // do something 
      return true; 
     default: 
      return super.onOptionsItemSelected(item); 
    } 
} 

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

private void updateToolbarWithBackButton() { 
    ActionBar actionBar = getSupportActionBar(); 
    if (null != mDrawerToggle && null != actionBar) { 
     mDrawerToggle.setDrawerIndicatorEnabled(false); 
     actionBar.setDisplayHomeAsUpEnabled(true); 
    } 
} 

private void updateToolbarWithHomeButton() { 
    ActionBar actionBar = getSupportActionBar(); 
    if (null != mDrawerToggle && null != actionBar) { 
     actionBar.setDisplayHomeAsUpEnabled(false); 
     mDrawerToggle.setDrawerIndicatorEnabled(true); 
     mDrawerToggle.syncState(); 
    } 
} 

がどのように私は戻るボタン<をキャプチャすることができます。

これが私のMainActivity.classのですか?


アップデート:以下の更新として、ツールバー上の戻る矢印ボタンを@マイクする

おかげで今の私MainActivityコードでonOptionsItemSelected内に捕捉されます。あなたはonOptionsItemSelected()方法がトグルをクリックすると起動するようにしたい場合は

@Override 
protected void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    toolbar = (Toolbar) findViewById(R.id.toolbar); 
    setSupportActionBar(toolbar); 

    getSupportActionBar().setDisplayHomeAsUpEnabled(true); 

    mDrawerLayout = (DrawerLayout) findViewById(R.id.drawer_layout); 
    mDrawerToggle = new ActionBarDrawerToggle(this, mDrawerLayout, R.string.openDrawerContentDescRes, R.string.closeDrawerContentDescRes); 
    mDrawerLayout.addDrawerListener(mDrawerToggle); 
    mDrawerToggle.syncState(); 

@Override 
public void onBackPressed() { 
    if (getFragmentManager().getBackStackEntryCount() == 0) { 
     super.onBackPressed(); 
    } else { 
     removeFragmentFromBackstack(); 
     updateToolbarWithHomeButton(); 
    } 

} 

@Override 
public boolean onOptionsItemSelected(MenuItem item) { 
    switch (item.getItemId()) { 
     case android.R.id.home: 
      //TODO: skip back press if fragment backstack count is 0. 
      onBackPressed(); 
      updateToolbarWithHomeButton(); 
      return true; 
     case R.id.action_x: 
      // do something 
      return true; 
     case R.id.action_y: 
      // do something 
      return true; 
     default: 
      return super.onOptionsItemSelected(item); 
    } 
} 

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

private void updateToolbarWithBackButton() { 
    ActionBar actionBar = getSupportActionBar(); 
    if (null != mDrawerToggle && null != actionBar) { 
     mDrawerToggle.setDrawerIndicatorEnabled(false); 
    } 
} 

private void updateToolbarWithHomeButton() { 
    ActionBar actionBar = getSupportActionBar(); 
    if (null != mDrawerToggle && null != actionBar) { 
     mDrawerToggle.setDrawerIndicatorEnabled(true); 
     mDrawerToggle.syncState(); 
    } 
} 

答えて

1

は、ActionBarDrawerToggleコンストラクタ呼び出しからtoolbar引数を削除します。

mDrawerToggle = new ActionBarDrawerToggle(this, mDrawerLayout, 
    R.string.openDrawerContentDescRes, R.string.closeDrawerContentDescRes); 

そうでない場合は、トグルは内部で引き出しを開閉扱い、ActionBarDrawerToggle#onOptionsItemSelected()への呼び出しは必要ありません。

Buttonを現在の状態に応じて別々にクリックして処理する場合は、onOptionsItemSelected()メソッドの先頭に戻るブロックifも削除する必要があります。

にを1回だけ呼び出す必要があります。オンとオフを切り替える必要はありません。引き出しインジケータを有効または無効にすると、そのことが処理されます。

+0

のようになります。onOptionsItemSelected()から

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

この行を削除します);しかし、id android.R.id.homeを持つMenuItemのスイッチケースは合格しません。戻るボタンには別のIDがありますか? –

+0

'mDrawerToggle.onOptionsItemSelected(item)'の呼び出しは、 'MenuItem'のIDが' android.R.id.home'のときに 'true'を返します。' if'ブロックが実行前に 'switch' 。その呼び出しを最初の 'case'に移動することができます。 –

+0

'if'ブロック内にlogステートメントを追加しましたが、戻るボタンをクリックすると' mDrawerToggle.onOptionsItemSelected(item) 'にtrueを返しません。 –

0

私は新しいActionBarDrawerToggle(これ、mDrawerLayout、R.string.openDrawerContentDescRes、R.string.closeDrawerContentDescResからツールバーを削除ので、それがこの

@Override 
public boolean onOptionsItemSelected(MenuItem item) { 

switch (item.getItemId()) { 
    case android.R.id.home: 
     // doesn't reach here ever. 
     return true; 
    case R.id.action_x: 
     // do something 
     return true; 
    case R.id.action_y: 
     // do something 
     return true; 
    default: 
     return super.onOptionsItemSelected(item); 
} 
} 
関連する問題