Android推薦使用DialogFragment代替Dialog,好處就說一點吧,DialogFragment就是個蓋在界面上的Fragment,它擁有Fragment一樣的功能和生命周期,解決普通Dialog旋轉屏幕后異常的問題;
使用DialogFragment實現網易雲音樂下載完成全局提醒、主流APP底部選擇彈框;Github DialogFragmentDemo源碼 完整的代碼在Github上面,歡迎Star!!!
1、使用方法一、
public class CustomViewDialog extends DialogFragment {
@Override
public View onCreateView(@NonNull LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {
return inflater.inflate(R.layout.dialog_view1,container);
}
}
//在Activity或Fragment中:
new CustomViewDialog().show(getSupportFragmentManager(),"2'");
2、使用方式二、
public class DialogTypeDialog extends DialogFragment {
@NonNull
@Override
public Dialog onCreateDialog(Bundle savedInstanceState) {
AlertDialog.Builder builder = new AlertDialog.Builder(getActivity());
builder.setTitle("提示")
.setMessage("重寫onCreateDialog其他就和Dialog設置方式相同,可以設置view或者dialog中設置setContentView和其他事件")
.setPositiveButton("確定", null)
.setNegativeButton("取消", null);
return builder.create();
}
}
3、全屏顯示Dialog:
Dialog有邊距不能全屏的原因是因為源碼中給Dialog的Window設置了Padding值,兩種方法可以讓其全屏:
①:DialogFragment全屏方式一:
// 最主要就是這句 windowIsFloating = false
<style name="DialogFullScreen" parent="Theme.AppCompat.Dialog">
<item name="android:windowIsFloating">false</item>
<item name="android:windowNoTitle">true</item>
<item name="android:background">@android:color/transparent</item>
<item name="android:windowBackground">@android:color/transparent</item>
<item name="android:windowFullscreen">true</item>
<item name="android:colorBackgroundCacheHint">@null</item>
</style>
//在DialogFragment中
@Override
public void onCreate(@Nullable Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setStyle(DialogFragment.STYLE_NO_TITLE,R.style.DialogFullScreen); //dialog全屏
}
②:DialogFragment全屏方式二、
//在DialogFragment中
@Override
public View onCreateView(@NonNull LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {
//去掉dialog的標題,需要在setContentView()之前
this.getDialog().requestWindowFeature(Window.FEATURE_NO_TITLE);
Window window = this.getDialog().getWindow();
//去掉dialog默認的padding
window.getDecorView().setPadding(0, 0, 0, 0);
WindowManager.LayoutParams lp = window.getAttributes();
lp.width = WindowManager.LayoutParams.MATCH_PARENT;
lp.height = WindowManager.LayoutParams.MATCH_PARENT;
window.setAttributes(lp);
final View view = inflater.inflate(R.layout.dialog_view2, null); //自己的布局文件
return view;
}
4、仿網易雲音樂,任務下載完畢的提示:
/**
* CCB:頂部顯示、全屏、寬度全屏、高度自定義、背景全透明;
* 仿網易雲音樂下載完成提示;
*/
public class TopDialog extends DialogFragment {
private LinearLayout ll;
@Override
public View onCreateView(LayoutInflater inflater, @Nullable ViewGroup container, Bundle savedInstanceState) {
View dialogView = inflater.inflate(R.layout.top_dialog,container); //顯示的布局
ll = dialogView.findViewById(R.id.mView);
FrameLayout.LayoutParams params = (FrameLayout.LayoutParams) ll.getLayoutParams();
params.topMargin = getStatusBarHeight(getDialog().getContext());
ll.setLayoutParams(params); //默認在最頂部,把狀態欄部分留出來
return dialogView;
}
@Override
public void onCreate(@Nullable Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setStyle(DialogFragment.STYLE_NO_TITLE,R.style.DialogFullScreen); //dialog全屏
}
@Override
public void onStart() {
super.onStart();
Window window = getDialog().getWindow();
WindowManager.LayoutParams windowParams = window.getAttributes();
windowParams.dimAmount = 0.0f;//Dialog外邊框透明
window.setLayout(-1, -2); //高度自適應,寬度全屏
windowParams.gravity = Gravity.TOP; //在頂部顯示
windowParams.windowAnimations = R.style.TopDialogAnimation;
window.setAttributes(windowParams);
}
/**
* 獲取狀態欄高度(單位:px)
*/
public static int getStatusBarHeight(Context context) {
Resources resources = context.getResources();
int resourceId = resources.getIdentifier("status_bar_height", "dimen", "android");
return resources.getDimensionPixelSize(resourceId) == 0 ? 60 : resources.getDimensionPixelSize(resourceId);
}
}
顯示時從頂部向下位移、隱藏是由當前位置向上唯一、動畫效果:
//注:style中
<style name="TopDialogAnimation">
<item name="android:windowEnterAnimation">@anim/dialog_top_show</item>
<item name="android:windowExitAnimation">@anim/dialog_top_hide</item>
</style>
//注:dialog_top_show
<?xml version="1.0" encoding="utf-8"?>
<set xmlns:android="http://schemas.android.com/apk/res/android">
<translate
android:duration="@android:integer/config_mediumAnimTime"
android:interpolator="@android:anim/accelerate_interpolator"
android:fromYDelta="-100%p"
android:toYDelta="0%p"/>
</set>
//注:dialog_top_hide
<?xml version="1.0" encoding="utf-8"?>
<set xmlns:android="http://schemas.android.com/apk/res/android">
<translate
android:duration="@android:integer/config_mediumAnimTime"
android:interpolator="@android:anim/accelerate_interpolator"
android:fromYDelta="0%p"
android:toYDelta="-100%p"/>
</set>
5、仿淘寶選擇拍照或相冊的底部彈框:
public class BottomDialog extends DialogFragment {
@Nullable
@Override
public View onCreateView(@NonNull LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {
//去掉dialog的標題,需要在setContentView()之前
this.getDialog().requestWindowFeature(Window.FEATURE_NO_TITLE);
Window window = this.getDialog().getWindow();
//去掉dialog默認的padding
window.getDecorView().setPadding(0, 0, 0, 0);
WindowManager.LayoutParams lp = window.getAttributes();
lp.width = WindowManager.LayoutParams.MATCH_PARENT;
lp.height = WindowManager.LayoutParams.WRAP_CONTENT;
//設置dialog的位置在底部
lp.gravity = Gravity.BOTTOM;
//設置dialog的動畫
lp.windowAnimations = R.style.BottomDialogAnimation;
window.setAttributes(lp);
window.setBackgroundDrawable(new ColorDrawable());
final View view = inflater.inflate(R.layout.dialog_view2, null);
return view;
}
}
淘寶選擇底部彈框動畫效果:
//注:style中
<style name="BottomDialogAnimation">
<item name="android:windowEnterAnimation">@anim/dialog_bottom_up</item>
<item name="android:windowExitAnimation">@anim/dialog_bottom_down</item>
</style>
//注:dialog_bottom_up
<set xmlns:android="http://schemas.android.com/apk/res/android">
<translate
android:duration="@android:integer/config_mediumAnimTime"
android:interpolator="@android:anim/accelerate_interpolator"
android:toYDelta="0"
android:fromYDelta="100%p"/>
</set>
//注:dialog_bottom_down
<?xml version="1.0" encoding="utf-8"?>
<set xmlns:android="http://schemas.android.com/apk/res/android">
<translate
android:duration="@android:integer/config_mediumAnimTime"
android:interpolator="@android:anim/accelerate_interpolator"
android:fromYDelta="0"
android:toYDelta="100%p"/>
</set>
布局文件等等的就不貼過來了,詳細請看Github DialogFragmentDemo源碼 完整的代碼在Github上面,歡迎Star!!!