2013-10-16 14 views
15

こんにちは私は、Activityと3個のフラグメントを使用しています。だから、私は3つのフラグメントA B Cを持っていると考えます。私はAからBに切り替えると、私はバックスタックにBとCのためのsimillarにFragmentを追加しています。バックスタックからポップされたときにフラグメントのonResume()が呼び出されない

しかし、私がCからBまたはBにAから来るとき、onResume()またはその他のライフサイクルメソッドFragmentを呼び出していないということです。

実際に何をしたいのですかFragmentActionBarには別のタイトルがあります。だから、私のコードでは、私はAからBまたはBに移動すると、私は断片内の活動タイトルを変更しています。しかし、それをクリックするとそれに応じて変化しません。

実際の問題は何ですか?バックスタックからポップアップした後、なぜonResume()と私のFragmentが呼び出されないのですか?この問題をどうやって解決するのですか?助けが必要。ありがとうございました。

+0

フラグメントのonResume()は、アクティビティが再開されたときにのみ呼び出されます。だから、これはあなたを助けません。私は今でも同様の問題に直面しています。 'OnBackStackChangedListener'を実装し、スタックの先頭にフラグメント名を取得し、それに基づいてアクションバーのタイトルを設定することができます。 – Uma

答えて

-1

フラグメントのonCreateView()でタイトルを変更しようとします。

+0

しかし、スタックからフラグメントをポップアップすると、ライフサイクルメソッドが呼び出されません。それではどうすればいいですか。 – nilkash

+0

フラグメントのonCreateViewメソッドでタイトルを変更する必要があります。 oncreateviewメソッドをスタックするためにフラグメントをポップまたは追加すると、フラグメントクラスに応じてタイトルが設定されます。 –

+0

@HarshitRathi私はこれを試しました。@nilkashはフラグメントがスタックからポップされ、新しいスタックが可視になったときに 'onCreateView()'が呼ばれないと言っています。 – Franco

10

FragmentTransactionではaddの代わりにreplaceメソッドを使用してください。私にとってはこの作品:Fragment

FragmentTransaction ft = activity.getSupportFragmentManager().beginTransaction(); 
ft.replace(R.id.fragment_container, fragment); 
ft.addToBackStack(null); 
ft.commit(); 
+0

これは機能します。おそらく受け入れられた答えになるはずです。 – RajV

+0

断片onResume()またはonPause()が活動onResume()またはonPause()が呼び出されたときにのみ呼び出されます。それらはアクティビティに緊密に結合されています。 replaceを呼び出すとonStop()が呼び出されます。 – Nepster

16

onResume()Activityが再開されたときにのみ呼ばれます。だから、これはあなたを助けません。私は今でも同様の問題に直面しています。 OnBackStackChangedListenerを実装し、スタックの先頭にフラグメント名を取得し、それに基づいてActionBarタイトルを設定することができます。

private FragmentManager.OnBackStackChangedListener getListener() 
{ 
    FragmentManager.OnBackStackChangedListener result = new FragmentManager.OnBackStackChangedListener() 
    { 
     public void onBackStackChanged() 
     { 
      FragmentManager manager = getFragmentManager(); 

      if (manager != null) 
      { 
       if(manager.getBackStackEntryCount() >= 1){ 
        String topOnStack = manager.getBackStackEntryAt(manager.getBackStackEntryCount()-1).getName(); 
        Log.i("TOP ON BACK STACK",topOnStack); 
       } 
       } 
      } 
    }; 

    return result; 
} 
1

このコードをあなたの断片に入れてください。

@Override 
public void setUserVisibleHint(boolean visible) { 
     super.setUserVisibleHint(visible); 
     if (visible && isResumed()) { 
      onResume(); 
     } 
    } 

    @Override 
    public void onResume() { 
     super.onResume(); 
     if (!getUserVisibleHint()) { 
      return; 
     } 
     setData(); 
    } 
+0

動作しません:(。 –

0

他の人がすでに述べたように、活動自体が再開されたときonResume()だけと呼ばれ、それがすべてで支援するつもりはないので。

  • あなたreplace()場合は、前のフラグメントが最初から再作成されることを以前のフラグメント、:あなたは新しいフラグメントを追加したり、フラグメント・トランザクションで既存のフラグメントを交換しているかどうかを確認する必要があり

    あなたはそれに戻りますので、onCreateView()が再び呼び出され、ツールバーのタイトルをそこで更新することができます。あなたはおそらくすでに行っています。

  • add()新しいフラグメントがある場合は、以前のフラグメントがまだ表示されていません。バック・スタックから最後のエントリを取得する(フラグメント・マネージャではgetBackStackEntryCount()およびgetBackStackEntryAt()を使用)、対応するフラグメント・オブジェクトを取得し(フラグメント・マネージャでfindFragmentByTag()を使用)、そのフラグメントを一部にキャストしますすべてのフラグメントが継承する基本クラス。カスタムメソッドを呼び出します。 onVisible()、その断片に。基本クラスのonVisible()のデフォルトの実装は何もしません。各フラグメントでオーバーライドして、ツールバーのタイトル、FABなどを必要に応じて更新します。コードの重複を避けるため、onResume()からonVisible()に電話しています。

関連する問題