Как заблокировать навигационный ящик, когда открыт другой

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

В нынешнем виде, когда (например) левый открыт, и вы проводите пальцем справа, чтобы закрыть его, правый ящик начинает открываться до того, как левый полностью закрывается. Это нежелательное поведение.

Вот что я пробовал, но получаю NullPointerException, когда смахиваю ящик.

// Left Drawer Config
_leftDrawerToggler = new DrawerToggler(this,
                                       _rootViewLayout,
                                       Resource.Drawable.ic_drawer_light,
                                       Resource.String.drawer_open,
                                       Resource.String.drawer_close);

_leftDrawerToggler.DrawerClosed += delegate
    {
        InvalidateOptionsMenu();
        _rootViewLayout.SetDrawerLockMode(DrawerLayout.LockModeUnlocked, _rightDrawerLayout);
    };

_leftDrawerToggler.DrawerOpened += delegate
{
    _leftDrawerList.SetItemChecked(0, true);
    InvalidateOptionsMenu();
    _rootViewLayout.SetDrawerLockMode(DrawerLayout.LockModeLockedClosed, _rightDrawerLayout);
};

_rootViewLayout.SetDrawerShadow(Resource.Drawable.drawer_shadow_dark, (int)GravityFlags.Left);
_rootViewLayout.SetDrawerListener(_leftDrawerToggler);



// Right Drawer Config
_rightDrawerToggler = new DrawerToggler(this,
                                       _rootViewLayout,
                                       Resource.Drawable.ic_drawer_light,
                                       Resource.String.drawer_open,
                                       Resource.String.drawer_close);

_rightDrawerToggler.DrawerClosed += delegate
    {
        InvalidateOptionsMenu();
        _rootViewLayout.SetDrawerLockMode(DrawerLayout.LockModeUnlocked, _leftDrawerLayout);
    };
_rightDrawerToggler.DrawerOpened += delegate
{
    _rightDrawerList.SetItemChecked(0, true);
    InvalidateOptionsMenu();
    _rootViewLayout.SetDrawerLockMode(DrawerLayout.LockModeLockedClosed, _leftDrawerLayout);
};

_rootViewLayout.SetDrawerShadow(Resource.Drawable.right_drawer_shadow_dark, (int)GravityFlags.Right);
_rootViewLayout.SetDrawerListener(_rightDrawerToggler);

person Chase Florell    schedule 11.04.2014    source источник


Ответы (1)


Проблема в том, что вы не блокируете право VieW. Другая проблема заключается в том, что вам нужно иметь только один Listener для DrawerLayout. Из вашего кода я понял, что у вас есть два слушателя для DrawerLayout

Ваш Layout XML должен иметь DrawerLayout с двумя ListView (layout_gravity для ListView должно быть start для одного и другого end )

Когда Drawer равно opened, проверьте, равно ли View Object View.equal(), затем заблокируйте другое ListView' and when the 'Drawer равно closed, разблокируйте другое ListView.

Измените свой код следующим образом

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

    mDrawerLayout = (DrawerLayout) findViewById(R.id.drawer_layout);
    mLeftDrawerList = (ListView) findViewById(R.id.left_drawer);
    mRightDrawerList = (ListView) findViewById(R.id.right_drawer);

    mDrawerToggle = new ActionBarDrawerToggle(this,
            mDrawerLayout,R.drawable.ic_drawer,
            R.string.drawer_open,R.string.drawer_close)
    {
        public void onDrawerOpened(View view){
            if(view.equals(mRightDrawerList)) {
                mDrawerLayout.setDrawerLockMode(DrawerLayout.LOCK_MODE_LOCKED_CLOSED, mLeftDrawerList);
            }
            else {
                mDrawerLayout.setDrawerLockMode(DrawerLayout.LOCK_MODE_LOCKED_CLOSED, mRightDrawerList);
            }
            invalidateOptionsMenu();
        }

        public void onDrawerClosed(View view)
        {
            if(view.equals(mRightDrawerList)) {
                mDrawerLayout.setDrawerLockMode(DrawerLayout.LOCK_MODE_UNLOCKED, mLeftDrawerList);
            }
            else {
                mDrawerLayout.setDrawerLockMode(DrawerLayout.LOCK_MODE_UNLOCKED, mRightDrawerList);
            }
            invalidateOptionsMenu();
        }
    };
    mDrawerLayout.setDrawerListener(mDrawerToggle);
}

Это должно работать. Дайте мне знать, если вы видите какие-либо проблемы.

person Libin    schedule 12.04.2014
comment
Это сделало это. Я только что добавил это в свой вспомогательный класс DrawerToggler и добавил _leftLayout и _rightLayout в конструктор перегрузки. Работает как чемпион! - person Chase Florell; 12.04.2014