繁体   English   中英

覆盖 onDismiss 或 onCancel 在 DialogFragment 中不起作用

[英]Overriding onDismiss or onCancel doesn't work in DialogFragment

我已经完全按照文档中的方式实现了全屏DialogFragment

public void showDialog() {
    CustomDialogFragment newFragment = new CustomDialogFragment();
    FragmentManager fragmentManager = getSupportFragmentManager();
    FragmentTransaction fragmentTransaction = fragmentManager.beginTransaction();

    fragmentTransaction.setTransition(FragmentTransaction.TRANSIT_FRAGMENT_OPEN);
    fragmentTransaction.add(android.R.id.content, newFragment).addToBackStack(null).commit();
}
public class CustomDialogFragment extends DialogFragment {

    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
        return inflater.inflate(R.layout.purchase_items, container, false);
    }

    @Override
    public Dialog onCreateDialog(Bundle savedInstanceState) {
        Dialog dialog = super.onCreateDialog(savedInstanceState);
        dialog.requestWindowFeature(Window.FEATURE_NO_TITLE);
        return dialog;
    }

    @Override
    public void onCancel(@NonNull DialogInterface dialog) {
        super.onCancel(dialog);
        // Code added her doesn't run on back press
    }
}

注意:如果我使用show()打开片段,onCancel onCancel()onDismiss()函数会正常运行,但这不是我想要的。 这是一个错误还是我做错了什么?

添加此方法以在活动中显示您的对话框:-

public void showDialog() {
    CustomDialogFragment newFragment = new CustomDialogFragment();
    newFragment.show(getSupportFragmentManager(), "show_fragment");
}

添加此样式:-

<style name="FullScreenfragment" parent="Theme.AppCompat.Light.Dialog">
    <item name="android:backgroundDimEnabled">false</item>
    <item name="android:windowNoTitle">true</item>
    <item name="android:padding">0dp</item>
    <item name="android:windowIsFloating">false</item>
    <item name="android:windowBackground">@android:color/transparent</item>
    <item name="android:windowCloseOnTouchOutside">false</item>
</style>

在您的 CustomDialogFragment 中添加此代码:-

@Override
public int getTheme() {
    return R.style.FullScreenfragment;
}

Function showDialog 有些问题,你可以试试这个调用显示你的自定义对话框:

public void showDialog() {
    CustomDialogFragment newFragment = new CustomDialogFragment();
    newFragment.show(getSupportFragmentManager(), "show_dialog");
}

文本“show_dialog”,您可以根据需要替换文本

编辑:如果你想要全屏对话框,试试这个:

添加自定义样式:

<style name="full_screen_dialog">
    <item name="android:windowIsFloating">true</item>
</style>

并在 CustomDialog 中设置:

public class CustomDialogFragment extends DialogFragment {
    @Nullable
    @Override
    public View onCreateView(@NonNull LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {
        return inflater.inflate(R.layout.purchase_items, container, false);
    }

    @NonNull
    @Override
    public Dialog onCreateDialog(@Nullable Bundle savedInstanceState) {
        Dialog dialog = super.onCreateDialog(savedInstanceState);
        dialog.requestWindowFeature(Window.FEATURE_NO_TITLE);
        return dialog;
    }

    @Override
    public void onCancel(@NonNull DialogInterface dialog) {
        super.onCancel(dialog);
    }

    @Override
    public int getTheme() {
        return R.style.full_screen_dialog;
    }

    @Override
    public void onResume() {
        super.onResume();
        if (getDialog() != null) {
            WindowManager.LayoutParams params = getDialog().getWindow().getAttributes();
            params.width = WindowManager.LayoutParams.MATCH_PARENT;
            params.height = WindowManager.LayoutParams.MATCH_PARENT;
            getDialog().getWindow().setAttributes(params);
        }
    }
}

因此,我最终覆盖了DialogFragment中的dismiss()onDestroyView()函数以具有相同的行为,同时仍将其作为片段而不是对话框打开,并且它似乎有效。

public class CustomDialogFragment extends DialogFragment {
    boolean isDismissed;
    OnCancelListener onCancelListener;

    public CustomDialogFragment(@NonNull OnCancelListener onCancelListener) {
        this.onCancelListener = onCancelListener;
    }

    @Nullable
    @Override
    public View onCreateView(@NonNull LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {
        return inflater.inflate(R.layout.purchase_items, container, false);
    }

    @NonNull
    @Override
    public Dialog onCreateDialog(@Nullable Bundle savedInstanceState) {
        Dialog dialog = super.onCreateDialog(savedInstanceState);
        dialog.requestWindowFeature(Window.FEATURE_NO_TITLE);
        return dialog;
    }

    @Override
    public void dismiss() {
        super.dismiss();
        this.isDismissed = true;
    }

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

        if (!this.isDismissed) {
            this.onCancelListener.onCancel();
        }
    }

    public interface OnCancelListener {
        void onCancel();
    }
}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM