创建Fragment基类
public abstract class BaseDialogFragment extends DialogFragment {
@Nullable
@Override
public View onCreateView(@NonNull LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {
View view = getLayoutView(inflater, container, savedInstanceState);
return view;
}
/**
* 获取view
* @param inflater
* @param container
* @param savedInstanceState
* @return
*/
protected abstract View getLayoutView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState);
/**
* 找控件
*/
protected void initViews(){ }
/**
* 设置数据
*/
protected void initDatum() { }
/**
* 设置监听器
*/
protected void initListeners() { }
@Override
public void onViewCreated(@NonNull View view, @Nullable Bundle savedInstanceState) {
super.onViewCreated(view, savedInstanceState);
initViews();
initDatum();
initListeners();
}
}
创建加载中DialogFragment
SuperRoundLoadingDialogFragment
继承基类BaseDialogFragment
public class SuperRoundLoadingDialogFragment extends BaseDialogFragment implements DialogInterface.OnKeyListener {
private TextView messageView;
@Override
protected void initDatum() {
super.initDatum();
String message = getArguments().getString(Constant.id);
if(message == null){
// 默认提示R.string.loading: "加载中"
message = getString(R.string.loading);;
}
messageView.setText(message);
}
// 创建fragment实例,传入要显示的提示
public static SuperRoundLoadingDialogFragment newInstance(String message) {
Bundle args = new Bundle();
// Constant.id常量,随便写什么都可以;我给的值是字符串"ID"
args.putString(Constant.id, message);
SuperRoundLoadingDialogFragment fragment = new SuperRoundLoadingDialogFragment();
fragment.setArguments(args);
return fragment;
}
// 创建fragment实例,使用默认提示
public static SuperRoundLoadingDialogFragment newInstance() {
Bundle args = new Bundle();
SuperRoundLoadingDialogFragment fragment = new SuperRoundLoadingDialogFragment();
fragment.setArguments(args);
return fragment;
}
@Override
protected View getLayoutView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
Dialog dialog = getDialog();
// 设置背景透明
dialog.getWindow().setBackgroundDrawableResource(android.R.color.transparent);
// 去掉标题
dialog.requestWindowFeature(Window.FEATURE_NO_TITLE);
// 点击遮罩不关闭
dialog.setCanceledOnTouchOutside(false);
View view = inflater.inflate(R.layout.super_round_dialog_loading, container);
messageView = view.findViewById(R.id.message);
messageView.setText("");
// 不响应返回键
dialog.setOnKeyListener(this);
return view;
}
// 不响应返回键
@Override
public boolean onKey(DialogInterface dialogInterface, int keyCode, KeyEvent keyEvent){
// 当前keycode等于返回
if(keyCode == KeyEvent.KEYCODE_BACK){
return true;
}
return false;
}
}
布局
super_round_dialog_loading.xml
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
xmlns:tools="http://schemas.android.com/tools">
<LinearLayout
android:paddingHorizontal="20dp"
android:paddingVertical="15dp"
android:gravity="center"
android:orientation="vertical"
android:background="@drawable/shape_round_dialog_background"
android:layout_width="wrap_content"
android:layout_height="120dp"
android:minWidth="120dp">
<ProgressBar
android:id="@+id/progressBar"
android:layout_width="40dp"
android:layout_height="40dp"
android:indeterminateDrawable="@drawable/anim_super_loading_icon"
android:indeterminateBehavior="repeat"/>
<!-- tools只会在预览展示,不会编译到页面 -->
<TextView
android:id="@+id/message"
android:layout_marginTop="10dp"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:textColor="#ffffff"
tools:text="加载中"/>
</LinearLayout>
</LinearLayout>
shape_round_dialog_background
黑色圆角背景
<?xml version="1.0" encoding="utf-8"?>
<shape xmlns:android="http://schemas.android.com/apk/res/android"
android:shape="rectangle">
<solid android:color="#88000000" />
<corners android:radius="10dp" />
</shape>
anim_super_loading_icon
旋转动画
<?xml version="1.0" encoding="utf-8"?>
<animated-rotate xmlns:android="http://schemas.android.com/apk/res/android"
android:drawable="@drawable/super_loading"
android:fromDegrees="0.0"
android:pivotX="50.0%"
android:pivotY="50.0%"
android:toDegrees="-360.0" />
super_loading
旋转动画的图标
使用
SuperRoundLoadingDialogFragment dialogFragment = SuperRoundLoadingDialogFragment.newInstance("hello");
// 显示
dialogFragment.show(getSupportFragmentManager(), "LoadingDialog");
// 3秒后隐藏
binding.button.postDelayed(()->{
dialogFragment.dismiss();
},3000);
显示隐藏封装在基类activity中
public class ...{
// 用弱引用,当activity释放,这里也会正常释放,如不用弱引用,可能造成内存泄漏
private WeakReference<SuperRoundLoadingDialogFragment> loadingDialogReference;
/**
* 显示加载对话框
*/
public void showLoading() {
showLoading(getString(R.string.loading));
}
/**
* 显示加载对话框
*/
public void showLoading(int data) {
showLoading(getString(data));
}
/**
* 显示加载对话框
*/
public void showLoading(String message) {
if (loadingDialogReference == null || loadingDialogReference.get() == null) {
loadingDialogReference = new WeakReference(
SuperRoundLoadingDialogFragment.newInstance(message)
);
}
SuperRoundLoadingDialogFragment dialogData = loadingDialogReference.get();
if (dialogData.getDialog() == null || !dialogData.getDialog().isShowing()) {
dialogData.show(getSupportFragmentManager(), "LoadingDialog");
}
}
/**
* 隐藏加载对话框
*/
public void hideLoading() {
SuperRoundLoadingDialogFragment loadingDialog = loadingDialogReference.get();
if (loadingDialog != null) {
loadingDialog.dismiss();
loadingDialogReference.clear();
}
loadingDialogReference = null;
}
}
使用
我们的activity继承这个基类activity就可以使用显示隐藏对话框的方法
showLoading("hello");
hideLoading();
1
1
1
1
1
1
1
1
1
1