Определите, открывается ли NavigationDrawer или закрывается

Могу ли я определить, открывается или закрывается навигационный ящик? Я читал о isDrawerOpen() а также isDrawerVisible() методы, но они возвращают true, только если навигационная панель открыта или видна соответственно.

Я также читал о onDrawerSlide(View drawerView, float slideOffset) метод, который вызывается, когда ящик движется. slideOffset это плавающее значение между 0 и 1, указывающее, в каком положении находится ящик. Но даже это вызывается, когда ящик открывается и закрывается.

Что мне нужно сделать, это сделать что-то, только когда ящик открывается, но не закрывается, что-то говорит мне, что я должен использовать onDrawerSlide(View drawerView, float slideOffset) метод, но я просто не могу понять, как проверить, открывается ли он и не закрывается.

Спасибо

2 ответа

Решение

Для отслеживания последнего значения вариант...

drawerLayout.setDrawerListener(new DrawerListener() {

        private float last = 0;

        @Override
        public void onDrawerSlide(View arg0, float arg1) {

            boolean opening = arg1>last;
            boolean closing = arg1<last;

            if(opening) {
                Log.i("Drawer","opening");
            } else if(closing) {
                Log.i("Drawer","closing");
            } else {
                Log.i("Drawer","doing nothing");
            }

            last = arg1;
        }

        @Override public void onDrawerStateChanged(int arg0) {}
        @Override public void onDrawerOpened(View arg0) {}
        @Override public void onDrawerClosed(View arg0) {}

    });

Если вы используете ActionBar ovveride ActionBarDrawerToggle

Дальнейшее чтение: слушайте события открытия и закрытия на developer.android.com

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

В Котлине:

  1. Инициализировать DrawerLayout View

    val drawerLayout: DrawerLayout = findViewById(R.id.drawer_layout)

  2. В своей основной деятельности создайте внутренний класс, который является подклассом DrawerLayout.DrawerListener. Класс DrawerLayout реализует интерфейс DrawerListener. Вы можете отслеживать изменение положения ящика в onDrawerSlide (версия ответа выше в Kotlin):

    inner class CustomDrawer : DrawerLayout.DrawerListener{
      override fun onDrawerStateChanged(newState: Int) {
      }
    
    var last: Float = 0f
    
    override fun onDrawerSlide(drawerView: View, slideOffset: Float) {
        imm.hideSoftInputFromWindow(drawerView?.getWindowToken(), 0)
    
        var opening: Boolean = slideOffset>last
        var closing: Boolean = slideOffset<last
    
        if(opening) {
            Log.i("Drawer","opening")
            Log.d("Last",last.toString())
        } else if(closing) {
            Log.i("Drawer","closing")
            Log.d("Last",last.toString())
        } else {
            Log.i("Drawer","doing nothing")
            Log.d("Last",last.toString())
        }
    }
    
    override fun onDrawerClosed(drawerView: View) {
    
      }
    
    override fun onDrawerOpened(drawerView: View) {
    
      }
    }
    
  3. Добавьте свой собственный DrawerListener в drawerLayout (я поместил его в метод onCreate)

    var drawerListener = CustomDrawer()drawerLayout.addDrawerListener(drawerListener)

Другие вопросы по тегам