方向改变后,DialogFragment会自行解散

时间:2015-05-27 14:21:24

标签: android android-dialogfragment dialogfragment fragment-lifecycle

以前曾问过类似的问题,但我的情况有所不同。

我的应用程序遍布DialogFragments。当我旋转手机时,除了这个之外,所有的DialogFragments都没有问题。

我已经用日志消息乱扔了生命周期回调,看看发生了什么,这就是场景:

  1. 我的DialogFragment已创建并显示
  2. 在轮换时,我将我想要的任何内容保存到捆绑包中以便以后进行修复。
  3. 已成功重新创建DialogFragment。我知道因为onCreate到onResume被称为。
  4. 在恢复之后,由于一些莫名其妙的原因,onPause,onStop,onDestroyView,onDestroy和onDetach被快速连续调用。 DialogFragment在娱乐后立即被销毁,我不知道为什么。
  5. 非常感谢任何帮助。 DialogFragment启动结果活动以拍照。它适用于大多数手机,但Galaxy S3相机会导致方向更改,从而迫使活动重新创建。我不介意这一点,我知道如何处理活动娱乐,但我从未遇到过。

    DialogFragment是通过主要托管活动中常规片段的RecyclerView适配器回调启动的。

    我没有在托管RecyclerView的片段中使用ChildFragmentManger显示DialogFragment,因为多个片段可以显示此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;
    
    门票是

    。希望能帮助其他人解决类似问题。

0 个答案:

没有答案