2

状況に応じて表示したい更新ボタンがあります。

[更新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;
}
4

1 に答える 1

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);
    }
}
}
于 2012-11-13T10:28:30.310 に答える