全屏Dialog的幾種實現

        在平時的開發中,經常遇到一些使用全屏彈窗的場景。今天,總結一下全屏彈窗的幾種實現方法,大家可以結合自己的使用場景和習慣選擇合適的方法。

        實現全屏彈窗,我總結了三種方法:

(1)全屏Dialog

(2)全屏DialogFragment

(3)全屏Activity

        在一般的情況下,使用Dialog即可,相信大家實現彈窗的第一選擇都是Dialog,這也是最簡單的方式。其實,大家可以嘗試一下DialogFragment,除了能實現Dialog的界面和功能外,因爲它本身是Fragment,所以,它有自己的生命週期管理。這裏需要注意一點,DialogFragment只能在Activity中去使用。至於全屏Activity,其實它的實現與前兩種方式差不多。但是,在有些場景下,或許使用全屏Activity實現彈窗是更合適的方法。大家都知道,我們彈Dialog是需要依附一個Activity的。假如我們要依附的Activity處於非alive狀態,那麼我們無法彈出Dialog。當然,也可以通過彈出懸浮窗的方式彈系統窗口。但是,這是另外一種比較流氓的場景,我們不多介紹。

一.全屏Dialog

public class FullScreenDialog extends Dialog {
    private TextView mBtn1;
    private TextView mBtn2;
    private ImageView mClose;
    private OnDialogClickListener mListener;


    public FullScreenDialog(@NonNull Context context) {
        super(context, R.style.FullScreenDialog);
        initView(context);
    }

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        WindowManager m = getWindow().getWindowManager();
        Display d = m.getDefaultDisplay();
        WindowManager.LayoutParams p = getWindow().getAttributes();
        p.height = d.getHeight();
        p.width = d.getWidth();
        getWindow().setAttributes(p);
    }

    public void initView(Context context) {
        View view = LayoutInflater.from(context).inflate(R.layout.dialog_layout, null);
        setContentView(view);
        setCancelable(false);
        setCanceledOnTouchOutside(false);
        mBtn1 = view.findViewById(R.id.tv_1);
        mBtn2 = view.findViewById(R.id.tv_2);
        mClose = view.findViewById(R.id.close);
        mBtn1.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                if (mListener != null) {
                    mListener.onBtn1Click();
                }
                dismiss();
            }
        });

        mBtn2.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                if (mListener != null) {
                    mListener.onBtn2Click();
                }
                dismiss();
            }
        });
        mClose.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {

                dismiss();
            }
        });
    }

    public void setOnDialogClickListener(OnDialogClickListener listener) {
        mListener = listener;
    }

    public interface OnDialogClickListener {

        void onBtn1Click();

        void onBtn2Click();
    }
}

二.全屏DialogFragment

public class FullScreenDialogFragment extends DialogFragment {

    private TextView mBtn1;
    private TextView mBtn2;
    private ImageView mClose;
    private FullScreenDialog.OnDialogClickListener mListener;

    @Nullable
    @Override
    public View onCreateView(@NonNull LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {
        final Window window = getDialog().getWindow();
        if (window != null) {
            window.setBackgroundDrawable(new ColorDrawable(Color.TRANSPARENT));
            window.requestFeature(Window.FEATURE_NO_TITLE);
            window.setFlags(WindowManager.LayoutParams.FLAG_NOT_FOCUSABLE, WindowManager.LayoutParams.FLAG_NOT_FOCUSABLE);
        }
        setCancelable(false);
        View view = inflater.inflate(R.layout.dialog_layout, container, false);
        initView(view);
        return view;
    }

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

    private void initView(View view) {
        mBtn1 = view.findViewById(R.id.tv_1);
        mBtn2 = view.findViewById(R.id.tv_2);
        mClose = view.findViewById(R.id.close);
        mBtn1.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                if (mListener != null) {
                    mListener.onBtn1Click();
                }
                dismiss();
            }
        });

        mBtn2.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                if (mListener != null) {
                    mListener.onBtn2Click();
                }
                dismiss();
            }
        });
        mClose.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {

                dismiss();
            }
        });
    }

    public void setOnDialogClickListener(FullScreenDialog.OnDialogClickListener listener) {
        mListener = listener;
    }

    public interface OnDialogClickListener {

        void onBtn1Click();

        void onBtn2Click();
    }
}

三.全屏Activity

public class FullScreenDialogActivity extends AppCompatActivity {

    private TextView mBtn1;
    private TextView mBtn2;
    private ImageView mClose;

    public static void startActivity(Context context){
        Intent intent = new Intent();
        intent.setClass(context,FullScreenDialogActivity.class);
        context.startActivity(intent);
    }

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.dialog_layout);
        final Window window = getWindow();
        if (window != null) {
            WindowManager.LayoutParams params = window.getAttributes();
            params.height = WindowManager.LayoutParams.MATCH_PARENT;
            params.width = WindowManager.LayoutParams.MATCH_PARENT;
            params.gravity = Gravity.BOTTOM;
            window.setAttributes(params);
        }
        initView();
    }

    private void initView() {
        mBtn1 = findViewById(R.id.tv_1);
        mBtn2 = findViewById(R.id.tv_2);
        mClose = findViewById(R.id.close);
        mBtn1.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                finish();
            }
        });

        mBtn2.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                finish();
            }
        });
        mClose.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {

                finish();
            }
        });
    }
}

        通過比較這三種方式的代碼,我們可以發現,其實最根本的就是設置window的一些參數和屬性,而這三種方式會有一點差異。相信代碼不難理解,我也不過多的介紹了。

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章