0

0

0

修罗

站点介绍

只有了解事实才能获得真正的自由

自定义加载动画DialogFragment

修罗 2023-01-28 553 0条评论 安卓

首页 / 正文

1690043775864.png

创建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

1690047523121.png

<?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();

评论(0)


最新评论

  • 1

    1

  • 1

    1

  • -1' OR 2+158-158-1=0+0+0+1 or 'TKCTZnRa'='

    1

  • 1

    1

  • 1

    1

  • 1

    1

  • 1

    1

  • @@5Qa2D

    1

  • 1

    1

  • 1

    1

日历

2025年09月

 123456
78910111213
14151617181920
21222324252627
282930    

文章目录

推荐关键字: Linux webpack js 算法 MongoDB laravel JAVA jquery javase redis