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を介して追加されたときに何が起こるのか分かりませんが、それを行うことに問題があるとか、置換機能が間違っていると思います。前もって感謝します!
レイアウトで宣言された 'Fragment'sは動的に削除/置換することはできません。そのトランザクションは静的な 'GameFragment'の上に' NewsFragment'を張っているだけです。 –
うわー!私は完全にその細部を読んでいないが、それはまさに私が経験していることである。私に教えてくれてありがとう。 – portfoliobuilder
@Mike Mこのスレッドには受け入れられた答えがあります。あなたのコメントをあなたの回答として投稿することができます。あなたのコメントは、それが参照されている文書へのリンクで受け付けています。プログラムですべてを実行するだけで問題は解決しました。魅力のように動作します。 – portfoliobuilder