2012-07-11 1 views
0

간단한 시나리오를 알려 드리겠습니다.ActionbarSherlock menuitem setActionView (null)은 회전을 멈추지 않습니다.

somethings가로드되는 동안 indeterminateProgressStyle (순환 원)으로 전환하는 내 작업 표시 줄에 새로 고침 버튼이 있어야합니다.

내 프로젝트에는 다음과 같은 레이아웃이 있습니다. (예 : res/layout/actionbar_indeterminate_progress.xml)

<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android" 
    android:layout_width="wrap_content" 
    android:layout_height="wrap_content" 
    android:gravity="center"> 
    <ProgressBar android:layout_width="32dp" 
     android:layout_height="32dp" 
     android:layout_marginLeft="12dp" 
     android:layout_marginRight="12dp" 
     android:layout_gravity="center" 
     style="?android:attr/indeterminateProgressStyle" /> 
</FrameLayout> 

사용자가 새로 고침 버튼을 클릭하면 다음을 수행합니다.

@Override 
public boolean onCreateOptionsMenu(Menu menu) { 
    com.actionbarsherlock.view.MenuInflater inflater = getSupportMenuInflater(); 
    inflater.inflate(R.menu.main, menu); 

    refreshMenuItem = menu.findItem(R.id.menu_refresh); 

    if (refreshMenuItem != null) { 
     // Show refresh button if we are in action bar mode, but only if 
     // there's something to be refreshed 
     boolean selectedItemExists = (getCurrentBrowsingContainer() != null); 
     refreshMenuItem.setVisible(selectedItemExists); 
     if (is_spinner_running) { 
      refreshMenuItem.setActionView(R.layout.actionbar_indeterminate_progress); 
     } else { 
      refreshMenuItem.setActionView(null); 
     } 
    } 

    return super.onCreateOptionsMenu(menu); 
} 

또한 내 res/menu/main.xml은 다음과 같습니다.

<?xml version="1.0" encoding="utf-8"?> 
<menu xmlns:android="http://schemas.android.com/apk/res/android"> 
    ... 
     <item android:id="@+id/menu_refresh" android:icon="@drawable/ic_menu_refresh" android:showAsAction="always" android:title="@string/refresh" /> 
    <item android:id="@+id/menu_search" android:title="@string/menu_search" android:icon="@android:drawable/ic_menu_search" android:showAsAction="never" /> 
    <item android:id="@+id/settings" android:title="@string/settings" android:icon="@android:drawable/ic_menu_preferences"></item> 
    <item android:id="@+id/exit" android:title="@string/exit" android:icon="@android:drawable/ic_menu_close_clear_cancel"></item> 
     ... 
</menu> 

문제는 예를 들어 초상화로 내 활동을 시작하고 새로 고침 버튼을 누르면 멋지게 중단된다는 것입니다. 이제 저는 그것을 회전시키고 새로 고침 버튼을 다시 누르지 만, 이제는 어떤 이유로 든 불확정 진도를 보여줍니다. 나는 체크했다. refreshMenuItem.setActionView (null)가 호출되었지만, 여전히 불확정성을 보여주는 것을 계속 유지한다. 또한 refreshMenuItem이 어떤 이유로 보이지 않는 것처럼 보입니다. 왜냐하면 indetermintate 진행을 클릭하면 onOptionsItemSelected가 호출되지 않기 때문입니다.

그래서 다른 샘플 app을 사용해 보았는데 문제없이 완벽하게 작동합니다. 그래서 나는 어디서 잘못 될 수 있는지 궁금합니다. 모든 포인터가 도움이 될 것입니다.

답변

1

사실 나는 문제를 알아 냈습니다. 내 프로젝트는 구성 변경을 처리하기로되어 있었기 때문에 (매니페스트에 configchanges이 있음) actionbarsherlock을 사용하면 configchanges가 응답하지 않게됩니다.

구성 변경 이전에 작업을 다시 작성하지 않았으므로 우리 코드의 일부에서 활동을 전달했습니다. 다시 작성하지 않았으므로 코드를 정리하고 처리했습니다. 이제는 작업 바를 작동 시키려면 configchanges에 대한 작업을 다시 만들어야합니다. 활동의 이전 인스턴스는 코드의 일부에 여전히 남아 있었고 활동의 새 인스턴스로 대체되지 않았습니다. 그래서 제가 회전을 멈추려 고 시도했던 menuitem은 실제로 새로운 인스턴스가 아닌 이전 인스턴스에 속해있었습니다.

그래서 코드는 현재 활동 인스턴스를 사용하도록 코드를 리팩토링하고 모든 것이 훌륭하게 작동했습니다!

+0

이것이 해결책 인 경우 이것을 대답으로 받아 들인다. :) –

0

중간 진행 상황을 클릭 할 때 onOptionsItemSelected가 호출되지 않음 : 액션보기가 설정되면 작업 항목의 기본 동작이 비활성화됩니다. previously set action provider도 무시합니다. 액션 뷰 클릭을 처리하는 유일한 방법은 OnClickListener를 설정하는 것입니다.

회전 후 중단하지 않는 중급 진행에 관해서는 :이 문제는 정확히 발생하지 않았습니다. 내 경우에는 새로 고침 작업 항목을 클릭 할 때 중간 진행률이 전혀 표시되지 않지만 코드에서 트리거 된 경우 멋지게 표시됩니다. 내가 만든 방법은 setActionView (...)를 호출하는 코드를 Handler.post(Runnable)으로 옮기는 것입니다.

+0

나는이 Handler.post를 게시물에 걸려 넘어지기 전에 끝내기도했다. 그 대안을 찾았습니까? 나는 약간 더러운 것을 느낀다 :/ – ben

+0

No 나는 : – Y2i

관련 문제