描述
类似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;
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](data:image/gif;base64,R0lGODlhAQABAIAAAAAAAP///yH5BAEAAAAALAAAAAABAAEAAAIBRAA7)
封装
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
|
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");
|