2013-10-06 2 views
0

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

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

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

Так что у меня есть:

_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, но она возвращает нуль, так что я не могу использовать его, чтобы опубликовать замедленное действие.

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

ответ

5

Адрес 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); 
+0

Я решил выбрать аналогичное решение. Я не могу поверить, что нет более элегантного способа добиться этого, но, черт возьми, что работает, работает. Благодаря! –

+0

@ EladAvron намного шире, например, используя build в getContentView(). PostDelayed (Runnable, int), если вы работаете в Activity? (Вы можете использовать postDelayed для любого представления на самом деле) – Redwarp

Смежные вопросы