web-dev-qa-db-ja.com

Activity.isFinishing()に相当するフラグメントは何ですか?

私の活動では、このイディオムを頻繁に使用します。

_@Override
public void onDestroy() {
    super.onDestroy();
    if (isFinishing() != true) return;
    // do some final cleanup since we're going away for good
}
_

フラグメントにはonDestroy()メソッドがありますが、isFinishing()と同等のものは何ですか?フラグメントのgetActivity().isFinishing()内からonDestroy()をチェックする必要がありますか?

追加するために編集:

getActivity()がnullまたは非nullを返すかどうか、およびnullでない場合は、getActivity().isFinishing()の値とともに、さまざまな状況で取得するコールバックを(順番に)示します。

シナリオ#1:DialogFragmentが表示され、ユーザーが戻るボタンをタップします(つまり、参照を解放する必要があります):

_onDismiss(): activity = non-null, finishing = false
onDestroy(): activity = non-null, finishing = false
_

シナリオ#2:DialogFragmentが表示され、親アクティビティが終了します(つまり、参照を解放する必要があります):

_onDestroy(): activity = non-null, finishing = true
onDismiss(): activity = null, finishing = n/a
_

シナリオ#3:DialogFragmentが表示され、OSが一時的に親アクティビティを破棄します(つまり、参照を解放しないでください):

_onDestroy(): activity = non-null, finishing = false
onDismiss(): activity = null, finishing = n/a
_
18
jph

フラグメントには isRemoving() というメソッドがあります。これは、フラグメントがアクティビティから削除されるときにtrueになります。

このフラグメントが現在そのアクティビティから削除されている場合はtrueを返します。これは、アクティビティが終了しているかどうかではなく、アクティビティから削除されている途中かどうかです。

14
Kevin Coppock

助けてくれてありがとう。これらをDialogFragmentに追加することになりました。

private void doReleaseReferences() {
    // release the stuff
}

@Override
public void onDestroy() {
    super.onDestroy();
    if (getActivity().isFinishing())
        doReleaseReferences();
}

@Override
public void onDismiss(DialogInterface dialog) {
    super.onDismiss(dialog);
    if (getActivity() != null)
        doReleaseReferences();
}

元の質問に追加したコールバックの動作に基づいて、これは私の目的に役立つと思います。戻るボタンが押されるか、親アクティビティが終了すると、参照が解放されます。親アクティビティが後で復活することを意図してOSによって破壊された場合、それらは解放されません。

4
jph

フラグメント参照をベースごとにクリーンアップする場合は、このヘルパーメソッドをフラグメント置換に使用できます。

public abstract class BaseActivity extends AppCompatActivity {

    @Override
    protected void onDestroy() {
        if (isFinishing()) {
            notifyStackedFragmentsFinishing();
        }
        super.onDestroy();
    }

    protected void changeFragment(Fragment fragment) {
         notifyStackedFragmentsFinishing();
         getSupportFragmentManager().beginTransaction()
            .replace(R.id.fragment, fragment)
            .commit();
    }

    private void notifyStackedFragmentsFinishing() {
        List<Fragment> fragments = getSupportFragmentManager().getFragments();
        if (fragments != null && !fragments.isEmpty()) {
            for (Fragment fragment : fragments) {
                ((BaseFragment) fragment).releaseOnFinishing();
            }
        }
    }

 }

これで、すべてのアクティビティをBaseActivityから拡張し、すべてのフラグメントをBaseFragmentから拡張できます。また、フラグメントをスタックする場合は、おそらくもっと拡張する必要があります。つまり、onBackPressed()

1
Kamil Seweryn