2013-10-06 4 views
0

그래서 DrawerLayout을 열어서 아이템이 메뉴에 추가 된 다음 닫힙니다.DrawerLayout을 열고 액션을 수행 한 다음 닫으십시오.

많은 것을 시도했지만 문제는 "열기"및 "닫기"명령 (또는 적어도 눈에 띄지 않는 명령) 사이에 지연이 없으므로 애니메이션이 트리거되지 않는다는 것입니다.

나는 더러워 보이기 때문에 '지연된 게시물'을 임의의 길이로 사용하고 싶지 않습니다. 수동으로 리스너에서 "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 

나는 심지어 DrawerLayout에 '() getAnimation'을 시도했지만 그래서 난 지연 조치를 게시하는 데 사용할 수 없습니다 null를 돌려줍니다.

누구나 접근 방법을 알고 있습니까? 난 그냥 임의의 지연을 사용해야하고 모든 장치에서 똑같이 보일까? 청취자 내에서 서랍을 닫을 수있는 방법이 있습니까? 미리 감사드립니다.

답변

5

closeDrawer()을 호출하는 것은 onDrawerOpened()에서 작동하지 않습니다. 물론 서랍이 열리지 않았기 때문입니다. onDrawerStateChanged()을 보면 onDrawerOpened()이 호출 된 후에도 상태가 계속 변경된다는 것을 알 수 있습니다.

onDrawerStateChanged()에 서랍이 유휴 상태라고 말했을 때 서랍을 닫으려고했으나 여전히 충돌했습니다. 네가 말한 것처럼 나의 마지막 해결책은 해커 야. 그러나 그것은 효과적이고 매끈 해 보인다. 이것은 그게 내 유틸리티 클래스, 당신은 어떤 종류 또는 스레드 관리자를 사용하는 경우 하나가 여기

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

책임의 한계와 법적 고지 게시처럼이 아마 조금 더 잘 볼 수 onDrawerOpened()

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

에 배치해야합니다. 그래도 내 응용 프로그램의 대부분에서 그것을 사용, 그것은 매우 편리합니다. 유틸리티를 사용하면 코드가 다음과 같이 보입니다.

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

비슷한 해결책을 선택했습니다. 나는 이것을 성취하는 더 우아한 방법이 없다고 믿을 수는 없지만, 효과가있는 것은 작동합니다. 감사! –

+0

@EladAvron getContentView()에서 빌드를 사용하는 것보다 훨씬 더 우아합니다. postDelayed (Runnable, int) 활동에 있다면? (실제로 모든 뷰에서 postDelayed를 사용할 수 있습니다) – Redwarp

관련 문제