2017-02-03 3 views
-1

XMLで追加された最初のフラグメントを置き換えても、ライフサイクルコールバックが破壊されないという問題が発生しています。 onDetach(),onDestroy(),onDestroyView(),onStop()などが挙げられる。これは、onDetach()でアクションを実行したいので問題を引き起こしています。XMLで追加されたフラグメントを置き換えるときにライフサイクルがない

これは私の設定です。正確に何がGoogleの開発者の文書は(https://developer.android.com/guide/components/fragments.html)と言う、私はレイアウト、activity_main.xml、フラグメントを作成します。

​​

このレイアウトは、私のMainActivityで参照されています。 FYIと同様に、含まれているフッターは、タブを表す4つのImageViewだけです。

@Override 
    public void onCreate(@Nullable Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.activity_main); 

     if (!Utils.checkIfNull(findViewById(R.id.frag_container))) { 

      // if we're being restored from a previous state, 
      // then we don't need to do anything and should return or else 
      // we could end up with overlapping fragments. 
      if (!Utils.checkIfNull(savedInstanceState)) { 
       return; 
      } 
     } 

     // initialize views 
     initializeViews(); 
    } 

私のアプリが起動すると、期待通りにGameFragmentが起動します。システムは、この活動のレイアウトを作成すると、文書はそれがレイアウトで指定された各 フラグメントをインスタンス化し、各フラグメントのレイアウトを取得するために、それぞれについてonCreateView()メソッド を呼び出し、

を述べています。システムは、 要素の代わりにフラグメントによって返されたビューを に挿入します。

私のGameFragment onCreateView()コールバックが呼び出され、すべてが初期化され、すべての機能を実行できます。問題は、タブを変更したときに発生します。私は現在のフラグメントを新しいものに置き換えることによってタブを変更します。ここに私が使用している機能があります。

public void addFragmentReplace(int containerId, @NonNull Fragment fragment) { 
    // check if the fragment has been added already 
    Fragment temp = mFragmentManager.findFragmentByTag(fragment.getClass().getSimpleName()); 
    if (!Utils.checkIfNull(temp) && temp.isAdded()) { 
     return; 
    } 

    // replace fragment and transition with animation 
    try { 
     if (!Utils.isStringEmpty(getTopFragment().getTag()) && getTopFragment().isAdded()) { 
      // pop back stack 
      popBackStack(); 
     } 
     mFragmentManager.beginTransaction().replace(containerId, fragment, 
       fragment.getClass().getSimpleName()).addToBackStack(null).commit(); 
    } catch (IllegalStateException e) { 
     e.printStackTrace(); 
     mFragmentManager.beginTransaction().replace(containerId, fragment, 
       fragment.getClass().getSimpleName()).addToBackStack(null) 
       .commitAllowingStateLoss(); // used as last resort 
    } 
} 

私は単に私が気付いてい行動が、他のタブに最初のタブから変更するとき、私はコールバックを受けないということである

addFragmentReplace(R.id.frag_container, new NewsFragment()); 

を言って関数を呼び出します。最初のタブに戻って他のタブに変更すると、すべてが完全に機能します。私は何が起きているのかをさらに理解するためにバックスタックを監視してみました。私のMainActivityのonCreate()メソッドでは、私はbackstackcountを記録しました。私のアプリを最初に起動した後、GameFragmentがはっきりと見えても、0として表示されます。私がタブを変更すると、私のバックスタック数は1になり、addFragmentReplace()メソッドのため何度タブを変更しても1のままです。私はフラグメントがXMLを介して追加されたときに何が起こるのか分かりませんが、それを行うことに問題があるとか、置換機能が間違っていると思います。前もって感謝します!

+1

レイアウトで宣言された 'Fragment'sは動的に削除/置換することはできません。そのトランザクションは静的な 'GameFragment'の上に' NewsFragment'を張っているだけです。 –

+1

うわー!私は完全にその細部を読んでいないが、それはまさに私が経験していることである。私に教えてくれてありがとう。 – portfoliobuilder

+0

@Mike Mこのスレッドには受け入れられた答えがあります。あなたのコメントをあなたの回答として投稿することができます。あなたのコメントは、それが参照されている文書へのリンクで受け付けています。プログラムですべてを実行するだけで問題は解決しました。魅力のように動作します。 – portfoliobuilder

答えて

0

XMLでフラグメントを追加すると、動的に削除/置換することができないことがわかりました。プログラムですべてを実行することで問題を解決しました。まず、MainActivityに私はGameFragment

@Override 
    public void onCreate(@Nullable Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.activity_main); 

     // Check that the activity is using the layout version with 
     // the fragment_container FrameLayout 
     if (!Utils.checkIfNull(findViewById(R.id.frag_container))) { 

      // However, if we're being restored from a previous state, 
      // then we don't need to do anything and should return or else 
      // we could end up with overlapping fragments. 
      if (!Utils.checkIfNull(savedInstanceState)) { 
       return; 
      } 

      addFragment(R.id.frag_container, new GameFragment()); 
     } 

     // initialize views 
     initializeViews(); 
    } 

を追加それから私は、フラグメントの一つに反対し、でframeLayoutコンテナを持っている私のXMLを変更しました。

<?xml version="1.0" encoding="utf-8"?> 
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" 
    xmlns:ads="http://schemas.android.com/apk/res-auto" 
    xmlns:tools="http://schemas.android.com/tools" 
    android:layout_width="match_parent" 
    android:layout_height="match_parent" 
    android:background="@drawable/sky_2" 
    tools:context=".activity.MainActivity" 
    tools:ignore="UselessParent,contentDescription"> 

    <FrameLayout 
     android:id="@+id/frag_container" 
     android:name="com.example.GameFragment" 
     android:layout_width="match_parent" 
     android:layout_height="match_parent"/> 

    <include layout="@layout/footer" /> 
</RelativeLayout> 
関連する問題