描述

类似IOS的圆角加载对话框

实现

SuperRoundLadingDialogFragment

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
import android.app.Dialog;
import android.content.DialogInterface;
import android.os.Bundle;
import android.view.KeyEvent;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.view.Window;
import android.widget.TextView;


import com.example.testandroid.R;
import com.example.testandroid.fragment.BaseDialogFragment;


/**
* 类似IOS的圆角加载对话框
* <p>
* 基于此框架进行修改:https://github.com/ydstar/loadingdialog
*/
public class SuperRoundLadingDialogFragment extends BaseDialogFragment implements DialogInterface.OnKeyListener {

private TextView messageView;

@Override
protected void initDatum() {
super.initDatum();
String message = getArguments().getString("SuperRoundLadingDialogFragment");
if (message == null){
message = getString(R.string.loading);
}
messageView.setText(message);
}

public static SuperRoundLadingDialogFragment newInstance(String message) {

Bundle args = new Bundle();
args.putString("SuperRoundLadingDialogFragment",message);

SuperRoundLadingDialogFragment fragment = new SuperRoundLadingDialogFragment();
fragment.setArguments(args);
return fragment;
}
public static SuperRoundLadingDialogFragment newInstance() {

Bundle args = new Bundle();

SuperRoundLadingDialogFragment fragment = new SuperRoundLadingDialogFragment();
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);

//不响应返回键
dialog.setOnKeyListener(this);

return view;
}

@Override
public boolean onKey(DialogInterface dialogInterface, int keyCode, KeyEvent keyEvent) {
return keyEvent.KEYCODE_BACK == keyCode ? true : false;
}
}

R.layout.super_round_dialog_loading

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"

xmlns:tools="http://schemas.android.com/tools"
android:layout_width="wrap_content"
android:layout_height="wrap_content">

<LinearLayout
android:layout_width="wrap_content"
android:layout_height="120dp"
android:background="@drawable/shape_round_dialog_background"
android:gravity="center"
android:minWidth="120dp"
android:orientation="vertical"
android:paddingHorizontal="20dp"
android:paddingVertical="15dp">

<ProgressBar
android:id="@+id/progressBar"
android:layout_width="40dp"
android:layout_height="40dp"
android:indeterminateBehavior="repeat"
android:indeterminateDrawable="@drawable/anim_super_loading_icon" />

<TextView
android:id="@+id/message"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginTop="@dimen/padding_meddle"
android:textColor="@color/white"
tools:text="login login login" />
</LinearLayout>
</LinearLayout>

黑色圆弧背景

@drawable/shape_round_dialog_background

1
2
3
4
5
6
7
8
<?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>

ProgressBar 动画

@drawable/anim_super_loading_icon

1
2
3
4
5
6
7
<?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" />

@drawable/super_loading

image-20230602154737239

封装

BaseLogicActivity

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
/**
* 本项目APP的通用逻辑
*/
public class BaseLogicActivity extends BaseCommonActivity{

private WeakReference<SuperRoundLoadingDialogFragment> loadingWeakReference;

......

//加载框

/**
* 显示加载对话框
*/
public void showLoading() {
showLoading(getString(R.string.loading));
}

/**
* 显示加载对话框
*/
public void showLoading(int data) {
showLoading(getString(data));
}

/**
* 显示加载对话框
*/
public void showLoading(String message) {
//避免发生内存泄露
if (loadingWeakReference == null || loadingWeakReference.get() == null) {
loadingWeakReference = new WeakReference<>(
SuperRoundLoadingDialogFragment.newInstance(message)
);
}
SuperRoundLoadingDialogFragment dialog = loadingWeakReference.get();
//避免多次展示
if (dialog.getDialog() == null || !dialog.getDialog().isShowing()) {
dialog.show(getSupportFragmentManager(), "SuperRoundLoadingDialogFragment");
}


}

/**
* 隐藏加载对话框
*/
public void hideLoading() {
SuperRoundLoadingDialogFragment dialog = loadingWeakReference.get();
if (dialog != null) {
dialog.dismiss();
loadingWeakReference.clear();
}
loadingWeakReference = null;
}
}

这里用到了Java的弱引用来避免内存泄露

就是加载对话框会持有本Activity,然后他们都去后台之后,本来Activity是应该释放的。

但是因为loading fragment 的持有就释放不了。

就会导致内存卸扣。

解决办法就是用:弱引用。

这个就会在activity在后台时候,下一次垃圾挥手就会回收。

总结

经此一封装,后面想显示加载对话开给你就只用:

1
showLoading("what you wanner say");