9

私は、いくつかの断片を含むことができる活性を有する。各フラグメントは、ActionBarに独自のメニュー項目を持つことができます。これまでのところうまく動作し、各アイテムはクリック可能で、目的のアクションを実行します。アクティビティのOnOptionsItemSelectedは、フラグメント内のonOptionsItemSelectedより前に呼び出されます。他の方法は可能ですか?

私の問題は次のとおりです。

public boolean onOptionsItemSelected(MenuItem item) { 
     switch (item.getItemId()) { 
     case android.R.id.home: 
      clearBackStack(); 
        setHomeFragment(); 
      return true; 
     default: 
      return super.onOptionsItemSelected(item); 

     } 
    } 

私は私がキャッチする必要がないように、すべての断片がこれを呼び出す必要があることを望んでいたので、私は活動でそれを宣言した:MainActivityで、私はアクションバーのHomeIconへの呼び出しをインターセプトするために、次の行を宣言しましたそれぞれの断片には、android.R.id.homeのケースがあります。

一つのフラグメントで、私はsetDisplayHomeAsUpEnabled(true)を使用しているので、ActionBarアイコンの左に小さな矢印が表示されます。 HomeIconをこのフラグメントでクリックするとHomeFragmentを設定したくないので、最後に表示されたFragmentを設定したいと思います。

@Override 
public boolean onOptionsItemSelected(MenuItem menuItem) { 

    switch (menuItem.getItemId()) { 
    case android.R.id.home: 
     setLastFragment(); 
       return true; 
    ... 

しかし、これは私はそれが動作するように望んでいたように動作しません:フラグメントのメソッド - だから私はonOptionsItemSelectedを持っています。アクティビティのonOptionsItemSelectedが最初に呼び出され、MenuItemがキャッチされ、HomeFragmentにリダイレクトされます。他のフラグメントで宣言された他のMenuItemで、私は同じ動作を確認することができます。アクティビティが最初に呼び出され、MenuItem(デフォルトのケース)がキャッチされず、super.onOptionsItemSelected(item)にリダイレクトされます。

これは、Androidがメニュークリックを処理する方法のようです。最初のアクティビティ、次にフラグメント。これを変更する方法はありますか?私は、すべてのフラグメントにandroid.R.id.home-caseを入れてそこで処理したくありません。これを行うにはより良い方法がありますか?

答えて

4

開発者のリファレンスによると、

「ここでそれを消費するために、通常のメニュー処理の続行を許可する場合はtrue falseを返します。」

したがって、私はonOptionsItemSelected()のアクティビティの実装でデフォルトで「false」を返すようにします。この方法では、イベントがフラグメントの実装に渡されます。

+9

これはMrHillが求めていたものではありません!私は同じ問題に直面している。通常、アクティビティは "ホームUP"ボタンを処理します。時には、特定のフラグメントが現在アクティブである間に "Home UP"ボタンが押されたときに特別なアクションを実行することがあります。アクティビティonOptionsItemSelectedでfalseを返すと、アクティビティがケースを処理できなくなります。 – John

1

可能かどうかわかりません。ここで利用できる公式ドキュメントでは:

http://developer.android.com/guide/topics/ui/actionbar.html#ActionEvents

次の状態のノート、あります:

[...]しかし、活動が最初のイベントを処理する機会を取得し、そのため、システムは最初に、そのフラグメントに対して同じコールバックを呼び出す前に、アクティビティに対してonOptionsItemSelected()を呼び出します。

+1

'Fragment'のライフサイクルの初期段階で' setHasOptionsMenu(true) 'を呼び出すことができれば**可能です**。 onCreateView()で –

8

この問題が発生したばかりで、次のコードを使用して動作させました。アクティビティのonOptionsItemSelected機能で 、追加:

if (id == android.R.id.home){ 
     Fragment currentFragment = getSupportFragmentManager().findFragmentById(R.id.container); 
     if(null != currentFragment && currentFragment.onOptionsItemSelected(item)){ 
      return true; 
     } 
    } 

とフラグメントのonOptionsItemSelected方法では、あなたが該当するものを処理します。 このようにして、フラグメントにメニューアイテムのために何かすることがあれば、それはそれを行い、他のプロセスを停止するためにtrueを返します。 フラグメントがこのアイテムと何も関係しない場合、falseを返すか、またはsuper.onOptionsItemSelectedメソッドを呼び出します。このメソッドは、最終的にfalseを返して他の人が処理できるようにします。

関連する問題