在平時的開發中,經常遇到一些使用全屏彈窗的場景。今天,總結一下全屏彈窗的幾種實現方法,大家可以結合自己的使用場景和習慣選擇合適的方法。
實現全屏彈窗,我總結了三種方法:
(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的一些參數和屬性,而這三種方式會有一點差異。相信代碼不難理解,我也不過多的介紹了。