DrawerLayout Double Drawer (левый и правый ящики одновременно)

У меня есть приложение, в котором я хочу реализовать двойной ящик – один слева и один справа. Левый выдвижной ящик предназначен для навигации по приложениям, правый ящик предназначен для фильтрации результатов.

Итак, макет выглядит так:

        

Вы можете четко видеть здесь «left_drawer» и «right_drawer», и их соответствующая гравитация – «начало» и «конец». И это действительно работает! Вы можете вытащить их обоих.

Проблема в том, что когда я реализую DrawerToggle – он только открывает левый ящик и не закрывает правый, поэтому, если правый ящик открыт, и я нажимаю кнопку DrawerToggle – левые ящики открываются ТАКЖЕ и перекрывают правый ящик ,

Есть несколько решений, которые я пытаюсь получить:

  1. Сделайте ту же самую кнопку DrawerToggle с правой стороны, с тем же поведением и анимацией, что и левая сторона.
  2. Сделайте ящик на противоположной стороне выдвижного ящика, который я пытаюсь открыть, – автоматически закрывается (если левый выдвижной ящик открыт, и я нажимаю переключатель правильного выдвижного ящика и наоборот).

И я не понял, как это сделать, потому что DrawerToggle принимает сам DrawerLayout как параметр, а не отдельные ящики …

Я пользуюсь библиотекой поддержки.

У кого-нибудь есть идеи? Заранее спасибо.

Вы можете вызвать его так, например, в обработчике ToggleButton:

 mDrawerLayout.openDrawer(mDrawer); mDrawerLayout.closeDrawer(mDrawer); 

Где mDrawer – это ссылка на конкретный ящик, который вам нужно открыть (будь то представление или макет), в вашем случае – фактический ListView, который вы хотите отобразить.

Вот код для Double Drawer Activity, который может быть расширен другими действиями для реализации двойного ящика, предполагая, что у них есть макет, подобный тому, который предлагает OP.

  public class DoubleDrawerActivity extends ActionBarActivity { private DrawerLayout mDrawerLayout; private ActionBarDrawerToggle mDrawerToggle; private View mLeftDrawerView; private View mRightDrawerView; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); getSupportActionBar().setDisplayHomeAsUpEnabled(true); getSupportActionBar().setHomeButtonEnabled(true); } @Override protected void onStart() { super.onStart(); if(mDrawerLayout == null || mLeftDrawerView == null || mRightDrawerView == null || mDrawerToggle == null) { // Configure navigation drawer mDrawerLayout = (DrawerLayout) findViewById(R.id.drawer_layout); mLeftDrawerView = findViewById(R.id.left_drawer); mRightDrawerView = findViewById(R.id.right_drawer); mDrawerToggle = new ActionBarDrawerToggle(this, mDrawerLayout, R.drawable.ic_navigation_drawer, R.string.drawer_open, R.string.drawer_close) { /** Called when a drawer has settled in a completely closed state. */ public void onDrawerClosed(View drawerView) { if(drawerView.equals(mLeftDrawerView)) { getSupportActionBar().setTitle(getTitle()); supportInvalidateOptionsMenu(); // creates call to onPrepareOptionsMenu() mDrawerToggle.syncState(); } } /** Called when a drawer has settled in a completely open state. */ public void onDrawerOpened(View drawerView) { if(drawerView.equals(mLeftDrawerView)) { getSupportActionBar().setTitle(getString(R.string.app_name)); supportInvalidateOptionsMenu(); // creates call to onPrepareOptionsMenu() mDrawerToggle.syncState(); } } @Override public void onDrawerSlide(View drawerView, float slideOffset) { // Avoid normal indicator glyph behaviour. This is to avoid glyph movement when opening the right drawer //super.onDrawerSlide(drawerView, slideOffset); } }; mDrawerLayout.setDrawerListener(mDrawerToggle); // Set the drawer toggle as the DrawerListener } } @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 onPrepareOptionsMenu(Menu menu) { // If the nav drawer is open, hide action items related to the content view for(int i = 0; i< menu.size(); i++) menu.getItem(i).setVisible(!mDrawerLayout.isDrawerOpen(mLeftDrawerView)); return super.onPrepareOptionsMenu(menu); } @Override public boolean onOptionsItemSelected(MenuItem item) { switch(item.getItemId()) { case android.R.id.home: mDrawerToggle.onOptionsItemSelected(item); if(mDrawerLayout.isDrawerOpen(mRightDrawerView)) mDrawerLayout.closeDrawer(mRightDrawerView); return true; } return super.onOptionsItemSelected(item); } } 

Вы можете использовать NavigationView из материального дизайна.

       

для получения дополнительной информации см. http://v4all123.blogspot.in/2016/03/simple-example-of-navigation-view-on.html

Вот мое короткое решение для всех, кто хочет предотвратить анимацию индикатора ящика, если они проведут правильный просмотр. Просто реализуйте метод onDrawerSlide, как это.

 mDrawerToggle = new ActionBarDrawerToggle(this, mDrawerLayout, R.drawable.ic_drawer_white, 0, 0) { @Override public void onDrawerClosed(View view) { invalidateOptionsMenu(); // creates call to onPrepareOptionsMenu() } @Override public void onDrawerOpened(View drawerView) { invalidateOptionsMenu(); // creates call to onPrepareOptionsMenu() } @Override public void onDrawerSlide(View drawerView, float slideOffset) { if (drawerView == mSlidingMenuNavigationList) { super.onDrawerSlide(drawerView, slideOffset); } else { // do nothing on all other views } } }; 

Используйте константу силы тяжести (Gravity.LEFT или Gravity.RIGHT) любого ящика, который вы хотите закрыть (при открытии другого) в onOptionsItemSelected (), как показано ниже.

 public boolean onOptionsItemSelected(MenuItem item) { if (mDrawerToggle.onOptionsItemSelected(item)) { // Close the right side drawer if visible if(mDrawerLayout.isDrawerVisible(Gravity.RIGHT)) { mDrawerLayout.closeDrawer(Gravity.RIGHT); } return true; } // Regular stuff switch (item.getItemId()) { case R.id.action_example: Toast.makeText(getActivity(), "Example action.", Toast.LENGTH_SHORT).show(); return true; } return super.onOptionsItemSelected(item); } 

mDrawerToggle = Объект Listener, реализующий DrawerLayout.DrawerListener
См .: http://developer.android.com/reference/android/support/v4/app/ActionBarDrawerToggle.html

Я решил добавить этот код в метод onOptionsItemSelected:

 switch (item.getItemId()) { case android.R.id.home: if (mDrawerLayout.isDrawerOpen(mDrawerList_right)){ mDrawerLayout.closeDrawer(mDrawerList_right); } mDrawerLayout.openDrawer(mDrawerList_left); } break; case R.id.action_drawer: if (mDrawerLayout.isDrawerOpen(mDrawerList_left)){ mDrawerLayout.closeDrawer(mDrawerList_left); } mDrawerLayout.openDrawer(mDrawerList_right); } default: break; } 

Я добавил кнопку действия и переопределил домашнюю кнопку панели действий

сделайте пользовательский элемент и добавьте его вправо, перейдите к нему в правый ящик.

 final ToggleButton ic_nav = (ToggleButton) customNav.findViewById(R.id.ic_nav); ic_nav.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View arg0) { if ( mDrawerLayout.isDrawerOpen(mDrawerList) && arg0.isSelected()) { mDrawerLayout.closeDrawer(mDrawerList); arg0.setSelected(false); } else if (!mDrawerLayout.isDrawerOpen(mDrawerList) && !arg0.isSelected()){ mDrawerLayout.openDrawer(mDrawerList); ic_nav.setSelected(false); arg0.setSelected(true); } } }); 
Давайте будем гением компьютера.