Откройте DrawerLayout, выполните действие, затем закройте его

Поэтому я хочу анимировать мой DrawerLayout таким образом, чтобы он был открыт, элемент добавлен в меню, а затем он закрыт.

Я пробовал много вещей, но проблема в том, что между командами "Открыть" и "Закрыть" (или, по крайней мере, не заметным) нет задержки, и поэтому анимация никогда не запускается.

Я действительно не хочу использовать "post delayed" с произвольной длиной, потому что это кажется грязным. Я попытался вручную переопределить "onDrawerOpened()" в прослушивателе - который был РАБОТАЕТ, но затем я не могу ЗАКРЫТЬ его ПОСЛЕ выполнения действия, потому что вы не можете закрыть его изнутри (что означает, если "closeDrawer" (макет ) 'метод вызывается из любого подпотока самого слушателя, он получит ошибку времени выполнения).

Итак, у меня есть:

_drawerToggle = new ActionBarDrawerToggle(MainActivity.this, _drawerLayout, R.drawable.ic_drawer, R.string.drawerOpen, R.string.drawerClose)
 {
 /** Called when a drawer has settled in a completely closed state. */
 public void onDrawerClosed(View view) {
 getActionBar().setTitle(_title);
 }

 /** Called when a drawer has settled in a completely open state. */
 public void onDrawerOpened(View drawerView) {
 myAction(); //My action 
 //If I try to invoke 'drawerClose()' here or in my action, a runtime error occurs
 }
 };
 _drawerLayout.setDrawerListener(_drawerToggle);
 _drawerLayout.openDrawer(_mainFrame);
 //If I invoke 'drawerClose()' the entire thing is just too fast and the animations don't trigger

Я даже попытался "getAnimation()" на DrawerLayout, но он возвращает null, поэтому я не могу использовать его для публикации замедленного действия.

У кого-нибудь есть идея, как подойти к этому? Должен ли я использовать произвольную задержку и надеюсь, что она будет выглядеть одинаково на всех устройствах? Есть ли способ закрыть ящик изнутри слушателя? Заранее спасибо!

1 ответ

Вызов closeDrawer() не работает в onDrawerOpened() потому что, ну, ящик не закончил открытие. Если вы посмотрите onDrawerStateChanged() вы увидите, что состояние все еще изменяется после onDrawerOpened().

Я попытался закрыть ящик, когда onDrawerStateChanged() сказал, что ящик простаивает, однако он все еще разбился. Мое окончательное решение выглядит, как вы сказали, взломанным. Но он работает и выглядит гладко. Это должно быть помещено в onDrawerOpened()

new Thread() {
 @Override
 public void run() {
 SystemClock.sleep(500);
 MainActivity.this.runOnUiThread(new Runnable() {
 @Override
 public void run() {
 mDrawerLayout.closeDrawers();
 }
 });
 }
}.start();

Вероятно, это может выглядеть немного лучше, если вы используете какой-то менеджер сортировки или потока, например,

https://gist.github.com/bclymer/6708605

Отказ от ответственности, что мой класс полезности. Я использую его в большинстве своих приложений, хотя это очень удобно. С помощью утилиты код будет выглядеть так:

ThreadManager.delayOnMainThread(new Runnable() {
 @Override
 public void run() {
 mDrawerLayout.closeDrawers(); 
 }
}, 500);

licensed under cc by-sa 3.0 with attribution.