4

2 つの ListFragments (実際には A と B SherlockListFragments) があり、両方のフラグメントにブレークポイントを設定するとonCreateOptionsMenu、フラグメント A は 3 回ヒットし、フラグメント B は 2 回ヒットします。さらに、AsyncTask実行中にメニュー アイコンの 1 つをアニメーション化しています。フラグメント A の項目を選択するonCreateOptionsMenuと、再び呼び出され、アイコンが 2 倍になります。

ここに画像の説明を入力

onCreateOptionsMenu「詳細」フラグメントでメソッドを呼び出しているだけなので、なぜ再度呼び出されるのかわかりません。

@Override
public void onListItemClick(final ListView l, final View v, final int position, final long id)
{
    DetailsFragment fragment = (DetailsFragment)getFragmentManager().findFragmentById(R.id.fragmentDetails);

    if (fragment != null && fragment.isInLayout())
    {
        fragment.DisplayItems();
    } 
    else 
    {
        final Intent listing = new Intent(activity.getApplicationContext(), DetailsFragmentActivity.class);
        startActivity(listing);
    }
}

アップデート:

このコードを使用して、メニュー項目をアニメーション化しています。

private MenuItem refreshItem;   

private void DoRefresh() 
{
    final LayoutInflater inflater = (LayoutInflater)activity.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
    final ImageView ivRefresh = (ImageView)inflater.inflate(R.layout.refresh_view, null);

    final Animation rotation = AnimationUtils.loadAnimation(activity, R.anim.refresh);
    ImageView ivRefresh.startAnimation(rotation);

    refreshItem.setActionView(ivRefresh);

    //AsyncTask is kicked off here
}

@Override
public boolean onOptionsItemSelected(final MenuItem item) 
{
    if (item.getItemId() == R.id.refresh) {
        refreshItem = item;
        this.DoRefresh();
        return true;
    } else {
        return super.onOptionsItemSelected(item);
    }
}
4

1 に答える 1

5

ドキュメントから:

「システムが onCreateOptionsMenu() を呼び出した後、入力したメニューのインスタンスを保持し、メニューが何らかの理由で無効にされない限り、onCreateOptionsMenu() を再度呼び出すことはありません。ただし、onCreateOptionsMenu() は初期メニュー状態を作成する場合にのみ使用する必要があります。アクティビティのライフサイクル中に変更を加えないでください。」

私の推測では、あなたがしていることによってメニューが無効になっていると思います。fragment.displayItems() は何をしますか?

于 2012-04-17T15:41:58.367 に答える