私は現在、「Android v4 の互換性ライブラリ」を使用するようにアプリケーションを適応させて、Android 1.6 ユーザーにもフラグメントを使用する利点を提供しようとしています。
コンテキスト メニューの実装は難しいようです。
- アプリケーションの主なアクティビティは、FragmentActivity クラスを拡張することです。
- フラグメントはすべて Fragment クラスを拡張する 1 つのクラスに基づいています。
- フラグメント クラスは 、そのonCreateView()メソッドでregisterForContextMenu()を呼び出しており、メソッド onCreateContextMenu()およびonContextItemSelected()をオーバーライドしています。
onCreateContextMenu()の場合、これはかなりうまく機能します。コンテキスト メニューはリソース ファイルから拡張され、選択された項目に基づいてわずかに変更されます (フラグメントが ListFragment でなくても、listView に基づいています)。
この問題は、コンテキスト メニュー エントリが選択されたときに発生します。 onContextItemSelected()は、最初に追加されたフラグメントから始まる、現在存在するすべてのフラグメントに対して呼び出されます。
私の場合、フラグメントはフォルダー構造のコンテンツを表示するために使用されます。サブフォルダ フラグメントのコンテキスト メニューが開かれ、メニュー項目が選択されると、最初に上位レベルでonContextItemSelected()が呼び出されます (現時点で許可されている/表示されているフラグメントの数によって異なります)。
現在、onCreateContextMenu()を呼び出す最後のフラグメントのタグを保持するアクティビティ レベルのフィールドによる回避策を使用しています。このようにして、格納されたタグが getTag() と同じでない場合に、onContextItemSelected()の先頭で「return super.onContextItemSelected(item)」を呼び出すことができます。しかし、このアプローチは私には少し汚いように見えます。
すべてのフラグメントで onContextItemSelected() が呼び出されるのはなぜですか? onCreateContextMenu()を呼び出していたものだけではありませんか?
これを処理する最もエレガントな方法は何ですか?