簡體   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