0

以前にも似たような質問がありましたが、私の場合は違います。

アプリ全体に DialogFragments があります。電話を回転させると、これ以外のすべての DialogFragments が問題なく戻ってきます。

何が起こっているのかを確認するために、ライフ サイクル コールバックにログ メッセージを散らかしました。これがシナリオです。

  1. 私のDialogFragmentが作成されて表示されます
  2. ローテーションでは、後で復元するために必要なものをバンドルに保存します。
  3. DialogFragment が正常に再作成されました。onCreate から onResume までが呼び出されるのでわかります。
  4. 再開直後、なぜか onPause、onStop、onDestroyView、onDestroy、onDetach が立て続けに呼び出されます。DialogFragment は再作成の直後に破棄されますが、その理由はわかりません。

どんな助けでも大歓迎です。DialogFragment は、結果のアクティビティを開始して写真を撮ります。これはほとんどの携帯電話でうまく機能しますが、Galaxy S3 のカメラでは方向が変化し、アクティビティが強制的に再作成されます。私はこれを気にしません。アクティビティのレクリエーションを処理する方法は知っていますが、これに遭遇したことはありません。

DialogFragment は、メインのホスティング アクティビティで、通常のフラグメントから RecyclerView アダプター コールバックを介して開始されます。

複数のフラグメントがこの DialogFragment を表示でき、関数は常に同じであるため、RecyclerView をホストするフラグメントで ChildFragmentManger を使用して DialogFragment を表示しません。どのフラグメントがそれを開始したかに関係なく、アクティビティがコールバックを受け取るようにする方がはるかに賢明でした。

フラグメントから:

    selectionPickAdapter.setAdapterListener(new selectionPickAdapter.AdapterListener() {
        @Override
        public void onSelectionClicked(Selection selection) {
            if (getActivity() instanceof RankingActivity) {
                ((RankingActivity) getActivity()).onSelectionClicked(selection);
            }
        }

    });

メインのホスティング アクティビティがコールバックを受け取り、次のように表示します。

    @Override
public void onSelectionClicked(Selection selection) {
    if (isSignedInUser) {
        selectionsToEdit.put(selection.hashCode(), selection);

        if (baseCategory != null) {
            selection.setCategory(baseCategory);
        }

        RankingSelectionEditDialogFragment rankingSelectionEditDialogFragment =
                RankingSelectionEditDialogFragment.newInstance(SELECTION_EDIT, selection.hashCode(), selection);

        rankingSelectionEditDialogFragment.show(getSupportFragmentManager(), EDIT_TAG);
    }
    else {
        Intent i = new Intent(this, BusinessActivity.class);
        i.putExtra(Constants.BUSINESS, selection.getBusiness().getId());
        startActivity(i);
    }
}

これらは私のライフサイクルコールバックです:

  @Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);

    if (savedInstanceState != null) {
        selectionToEdit = savedInstanceState.getParcelable(SELECTION_TO_EDIT);
        imagePath = savedInstanceState.getString(IMAGE_PATH);
    }
    else {
        selectionToEdit = getArguments().getParcelable(SELECTION_TO_EDIT);
    }
}


    @Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
    if (savedInstanceState != null) {
        Log.i(TAG, "CREATED A SECOND TIME!");
    }
    else {
        Log.i(TAG, "CREATED ONCE!");
    }

    // Inflate the layout for this fragment
    View rootView = inflater.inflate(R.layout.fragment_ranking_edit, container, false);
    initializeViewComponents(rootView);
    return rootView;
}

 @Override
public void onActivityCreated(Bundle savedInstanceState) {
    super.onActivityCreated(savedInstanceState);

    setupFragment(selectionToEdit);
}

    @Override
public void onResume() {
    super.onResume();

    Log.i(TAG, "onResume");

    Dialog dialog = getDialog();

    if (dialog != null) { // Only do this if returning a dialog, not a fragment

        Log.i(TAG, "Dialog is not null");

        SharedPreferences sharedPreferences
                = getActivity().getSharedPreferences(Constants.PREFS, Context.MODE_PRIVATE);

        // Get items required to put dialog just under the ActionBar.

        int screenWidth = sharedPreferences.getInt(Constants.SCREEN_WIDTH, 720);
        int screenHeight = sharedPreferences.getInt(Constants.SCREEN_HEIGHT, 1280);
        int screenDPI = sharedPreferences.getInt(Constants.SCREEN_DPI, 320);

        Window window = dialog.getWindow();

        window.setLayout(screenWidth, WindowManager.LayoutParams.WRAP_CONTENT);
        WindowManager.LayoutParams windowLayoutParams = window.getAttributes();

        window.setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_STATE_VISIBLE);

        windowLayoutParams.y = -((screenHeight / 2) - 56) * (screenDPI / 160);
        window.setAttributes(windowLayoutParams);

        if (dialog.isShowing()) {
            Log.i(TAG, "Dialog is showing");
        }
        else {
            Log.i(TAG, "Dialog is not showing");
        }

    }

    else {
        Log.i(TAG, "Dialog is null");
    }
    Log.i(TAG, "onResume finished");
}

    /**
 * The system calls this only when creating the layout in a dialog.
 */
@Override
@NonNull
public Dialog onCreateDialog(Bundle savedInstanceState) {

    Dialog dialog = super.onCreateDialog(savedInstanceState);

    // The only reason you might override this method when using onCreateView() is
    // to modify any dialog characteristics. For example, the dialog includes a
    // title by default, but your custom layout might not need it. So here you can
    // remove the dialog title, but you must call the superclass to get the Dialog.

    SharedPreferences sharedPreferences
            = getActivity().getSharedPreferences(Constants.PREFS, Context.MODE_PRIVATE);

    // Get items required to put dialog just under the ActionBar.

    int screenWidth = sharedPreferences.getInt(Constants.SCREEN_WIDTH, 720);
    int screenHeight = sharedPreferences.getInt(Constants.SCREEN_HEIGHT, 1280);
    int screenDPI = sharedPreferences.getInt(Constants.SCREEN_DPI, 320);

    dialog.requestWindowFeature(Window.FEATURE_NO_TITLE);
    Window window = dialog.getWindow();

    window.setLayout(screenWidth, WindowManager.LayoutParams.WRAP_CONTENT);
    WindowManager.LayoutParams windowLayoutParams = window.getAttributes();

    window.setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_STATE_VISIBLE);

    windowLayoutParams.y = -((screenHeight / 2) - 56) * (screenDPI / 160);
    windowLayoutParams.flags &= ~WindowManager.LayoutParams.FLAG_DIM_BEHIND;
    window.setAttributes(windowLayoutParams);

    return dialog;
}



/**
 * Restore the previous currentFragment before the dialog was brought up
 */
@Override
public void dismiss() { // Used when the user deliberately dismisses the dialog
    Log.i(TAG, "Dismissed");
    super.dismiss(); // Ensure Super class method is called
}

/**
 * Restore the previous currentFragment before the dialog was brought up
 */
@Override
public void onCancel(DialogInterface dialog) { // Used when the user inadvertently leaves the dialog,
    // e.g back pressed or touched outside the dialog
    Log.i(TAG, "Cancelled");
    super.onCancel(dialog); // Ensure Super class method is called
}

@Override
public void onSaveInstanceState(Bundle outState) {
    super.onSaveInstanceState(outState);
    outState.putParcelable(SELECTION_TO_EDIT, selectionToEdit);
    outState.putString(IMAGE_PATH, imagePath);
}

@Override
public void onPause() {
    Log.i(TAG, "onPause");
    super.onPause();

}

@Override
public void onStop() {
    Log.i(TAG, "onStop");
    super.onStop();
}

@Override
public void onDestroyView() {
    Log.i(TAG, "View Destroyed");
    super.onDestroyView();
}

@Override
public void onDestroy() {
    Log.i(TAG, "onDestroy");
    super.onDestroy();
}

@Override
public void onDetach() {
    Log.i(TAG, "onDetach");
    super.onDetach();
}

編集:問題を修正しました。DialogFragment を表示するには、アクティビティではなく、ホスティング フラグメントの ChildFragmentManager を使用する必要があります。つまり、次のように変更します。

 RankingSelectionEditDialogFragment rankingSelectionEditDialogFragment =
                RankingSelectionEditDialogFragment.newInstance(SELECTION_EDIT, selection.hashCode(), selection);

        rankingSelectionEditDialogFragment.show(getSupportFragmentManager(), EDIT_TAG);

これに:

            RankingSelectionEditDialogFragment rankingSelectionEditDialogFragment =
                RankingSelectionEditDialogFragment.newInstance(SELECTION_EDIT, selection.hashCode(), selection);

        switch (currentFragment) {
            case CATEGORY_PICK:
                rankingCategoryPickFragment = (RankingCategoryPickFragment)
                        getSupportFragmentManager().findFragmentByTag(CATEGORY_PICK_TAG);

                if(rankingCategoryPickFragment != null) {
                    rankingSelectionEditDialogFragment.show
                            (rankingCategoryPickFragment.getChildFragmentManager(), EDIT_TAG);
                }
                break;
            case BUSINESS_SORT:
                rankingBusinessSortParentFragment = (RankingBusinessSortParentFragment)
                        getSupportFragmentManager().findFragmentByTag(BUSINESS_SORT_TAG);

                if(rankingBusinessSortParentFragment != null) {
                    rankingSelectionEditDialogFragment.show
                            (rankingBusinessSortParentFragment.getChildFragmentManager(), EDIT_TAG);
                }
                break;

チケットでした。同様の問題を抱えている他の人に役立つことを願っています。

4

0 に答える 0