2013-11-04 74 views
0

我想在用戶單擊操作欄中的菜單項並啓動一個可以完成某些工作的AsyncTask時顯示進度條。完成後,任務恢復菜單。這是我的代碼:屏幕旋轉後更新菜單項

public class DevicesActivity extends FragmentActivity { 
... 

@Override 
public boolean onOptionsItemSelected(MenuItem item) { 
    switch (item.getItemId()) { 
      case R.id.my_menu_action: 
       MyTask task = new MyTask(); 
       task.execute(item); 
       // Show a progress bar instead of default actionview 
       item.setActionView(R.layout.progress_circle); 
       item.expandActionView(); 
       return true; 
     } 
     return super.onOptionsItemSelected(item); 
    } 

    ... 

    private class MyTask extends AsyncTask<MenuItem, Object, Object> { 
     MenuItem menuItem; 

     protected Object doInBackground(MenuItem... items) { 
      item = items[0]; 

      try { 
       Thread.sleep(2000); 
      } 
      catch (Exception e) {} 

      return null; 
     } 

     protected void onPostExecute(Object result) { 
      // Restore default action view 
      if (menuItem != null) { 
       menuItem.collapseActionView(); 
       menuItem.setActionView(null); 
      } 
     } 
    } 
} 

當活動被重建,會出現問題,因爲未示出的進度條和內部MyTask的菜單項參考變爲無效(旋轉屏幕時例如)。所以問題是: 1)當創建菜單(onCreateOptionsMenu方法)時,我怎麼知道menuItem是否被點擊? 2)在onPostExecute如何檢索一個MenuItem對象的有效引用?

回答

0

閱讀使用以下方法

onCreateOptionsMenu 
onPrepareOptionsMenu 
onOptionsItemSelected 
invalidateOptionsMenu 

現在,當你點擊一個項目,從onOptionsItemSelected保存到項目的引用點擊。接下來啓動AsyncTask並顯示ProgressBar。完成任務後,要更新菜單項,請從AsyncTask的onPostExceute調用invalidateOptionsMenu。

您可以在屏幕配置更改等之前使用onSaveInstanceState()保存menuItem的狀態(可見/不可見),並從savedInstanceBundle重新創建。

您必須具有顯示/隱藏onPrepareOptionsMenu中的菜單項的邏輯。無論何時您想更新菜單項,請致電invalidateOptionsMenu。

希望它給你一個方向。

+0

如何簡單地將MenuItem引用保存在onSaveInstanceState包中?我試圖將其轉換爲可序列化,但這不起作用。 – ElliotM

+0

我錯了,我應該說「保存菜單項的狀態」,而不是菜單項的引用。 – jagmohan