NavigationDrawer: больше нет анимации на значке ящика при настройке прослушивателя ящика

#android #animation #android-actionbar #navigation-drawer

#Android #Анимация #android-панель действий #навигация-ящик

Вопрос:

Значок ящика <— значок ящика

Если вы создаете с помощью android Studio проект с навигационным ящиком, при открытии / закрытии ящика будет плавная анимация значка ящика.

Если я добавлю прослушиватель ящика в свой drawerlayout, анимации больше нет, значок ящика больше не меняется:

 DrawerLayout dl = (DrawerLayout) findViewById(R.id.drawer_layout);
    dl.setDrawerListener(new ActionBarDrawerToggle(this, dl,R.drawable.ic_drawer,R.string.navigation_drawer_open,R.string.navigation_drawer_close));
  

Я попытался переопределить методы ActionBarDrawerToggle для добавления вызовов в syncState().

    DrawerLayout dl = (DrawerLayout)findViewById(R.id.drawer_layout);

    mDrawerToggle = new ActionBarDrawerToggle(this, dl,
            R.drawable.ic_drawer, R.string.drawer_open, R.string.drawer_close) {

        @Override
        public void onDrawerSlide(View drawerView, float slideOffset) {
            super.onDrawerSlide(drawerView, slideOffset);
            mDrawerToggle.syncState();
        }

        @Override
        public void onDrawerStateChanged(int newState) {
            super.onDrawerStateChanged(newState);
            mDrawerToggle.syncState();
        }

        public void onDrawerClosed(View view) {
            super.onDrawerClosed(view);
            mDrawerToggle.syncState();
        }

        /** Called when a drawer has settled in a completely open state. */
        public void onDrawerOpened(View drawerView) {
            super.onDrawerOpened(drawerView);
            mDrawerToggle.syncState();
        }
    };
    dl.setDrawerListener(mDrawerToggle);
  

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

Кто-нибудь знает, как получить плавную анимацию?

Ответ №1:

Попробуйте поместить @Override аннотации, которые отсутствуют для последних двух прослушивателей, и удалить все syncState() вызовы. Вызовите syncState() из onPostCreate :

 @Override
protected void onPostCreate(Bundle savedInstanceState) {
    super.onPostCreate(savedInstanceState);
    // Sync the toggle state after onRestoreInstanceState has occurred.
    mDrawerToggle.syncState();
}
  

Комментарии:

1. Я только что попробовал, это не меняет поведение: нет анимации.

Ответ №2:

У меня была такая же проблема.Прошло много времени с тех пор, как был задан вопрос, но если вам все еще интересно, вот мой ответ.

поместите

 invalidateOptionsMenu(); 
  

вместо

 syncstate();
  

для onDrawerClosed(), onDrawerOpened(), onDrawerSlide(), onDrawerStateChanged()

Кроме того, поместите

 @Override

protected void onPostCreate(Bundle savedInstanceState){

        super.onPostCreate(savedInstanceState);

        mDrawerToggle.syncState();
}

@Override

public void onConfigurationChanged(Configuration newConfig) {

        super.onConfigurationChanged(newConfig);

        mDrawerToggle.onConfigurationChanged(newConfig);
}
  

Ответ №3:

Введите логическое значение как false.. private boolean isDrawerOpen = false;

 public void onDrawerSlide(View drawerView, float slideOffset) {
            if(slideOffset > .55 amp;amp; !isDrawerOpen){
                super.onDrawerSlide(drawerView, 1);
                onDrawerOpened(drawerView);
                isDrawerOpen = true;
            } else if(slideOffset < .45 amp;amp; isDrawerOpen) {
                super.onDrawerSlide(drawerView,slideOffset);
                onDrawerClosed(drawerView);
                isDrawerOpen = false;
            }
        }

        public void onDrawerClosed(View view) {
            getActionBar().setTitle("Your title");
            invalidateOptionsMenu();
        }

        public void onDrawerOpened(View drawerView) {
            getActionBar().setTitle("your title");
            invalidateOptionsMenu();
        }
    };
  

Комментарии:

1. Я попробовал ваше решение, но оно не решает мою проблему: у меня нет плавной анимации (я просто вижу значок открытого ящика, а затем значок закрытого ящика, а не анимацию).