2012-11-13 70 views
2

我有一個刷新按鈕,我想根據情況使其可見。在asynctask之後麻煩製作menuitem

刷新按鈕被點擊我可以把它不會有問題看不見的,但是,一旦AsyncTask過程結束後,我不能做它再次可見。我無法將MenuItem的值傳遞迴AsyncTask

public boolean onCreateOptionsMenu(Menu menu) { 
    super.onCreateOptionsMenu(menu); 
    getSupportMenuInflater().inflate(R.menu.refresh_action_provider, menu);   
    return true; 
} 

@Override 
public boolean onOptionsItemSelected(MenuItem item) { 
    switch(item.getItemId()) { 
    case R.id.menu_refresh: 
     item.setVisible(false); //hide refresh button 
     setSupportProgressBarIndeterminateVisibility(true); 
    Toast.makeText(getApplicationContext(), "REFRESH CLiCKED", Toast.LENGTH_SHORT).show(); 
    new DownloadNewsTask().execute(); 
    return true; 
    } 
    return false; 
} 

回答

6

你可以通過你的項目在任務的構造函數,存儲並使其可見onPostExecute方法:

public class DownloadNewsTask extends AsyncTask<...> { 

    private final MenuItem item; 

    public DownloadNewsTask(MenuItem item) { 
     this.item = item; 
    } 

    @Override 
    protected void onPostExecute(Void result) { 
     super.onPostExecute(result); 
     item.setVisible(true); 
    } 

    ... 
} 

然後:

new DownloadNewsTask(item).execute(); 

你也可以擁有項目成爲你的活動課的一員,如果它被定義爲你的活動的內部類,則從你的任務中訪問它:

public class TestActivity extends Activity { 

protected MenuItem refreshItem; 

@Override 
public boolean onCreateOptionsMenu(Menu menu) { 
    super.onCreateOptionsMenu(menu); 
    getSupportMenuInflater().inflate(R.menu.refresh_action_provider, menu); 
    return true; 
} 

@Override 
public boolean onOptionsItemSelected(MenuItem item) { 
    switch (item.getItemId()) { 
    case R.id.menu_refresh: 
     this.refreshItem = item; 
     item.setVisible(false); // hide refresh button 
     setSupportProgressBarIndeterminateVisibility(true); 
     Toast.makeText(getApplicationContext(), "REFRESH CLiCKED", Toast.LENGTH_SHORT).show(); 
     new DownloadNewsTask().execute(); 
     return true; 
    } 
    return false; 
} 

public class DownloadNewsTask extends AsyncTask<Void, Void, Void> { 

    @Override 
    protected Void doInBackground(Void... params) { 
     // your stuff... 
    } 

    @Override 
    protected void onPostExecute(Void result) { 
     super.onPostExecute(result); 
     refreshItem.setVisible(true); 
    } 
} 
} 
+0

它很好地工作,謝謝。但'onCreate'還有另外一個問題,我也叫'new DownloadNewsTask()。execute();'現在沒有'item',它不能再觸發了。可能使菜單項全局? – Eric

+0

我認爲最好儘量避免使用全球性的東西......但如果在您的Activity類中定義了「DownloadNewsTask」,那麼您可以將此項作爲活動類的成員並從您的內部類訪問它(例如您的任務) – fiddler

+0

你能不能示範一個例子? – Eric