0

0

0

修罗

站点介绍

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

自定义加载动画DialogFragment

修罗 2023-01-28 753 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)


最新评论

  • https://www.studyglobus.com/author/carroll34a5552/

    Ценники на вывоз мусора сейчас космос, любые лайфхаки по экономии в тему.

  • Richardgrold

    1xbet onlayn kazino platforması ilə vaxtınızı daha səmərəli və maraqlı keçirin. Saytın canlı kazino bölməsi istifadəçilərə fərqli bir dünya təklif edir. Burada canlı dilerli kazino oyunlarının hər bir növünü sınaqdan keçirə bilərsiniz. Krupyelərin peşəkarlığı oyunun dinamikasını və marağını artırır. Müntəzəm olaraq yenilənən oyun siyahısı cansıxıcılığa yol vermir. Hesabınızı artırmaq üçün onlarla fərqli və etibarlı üsul mövcuddur. Qazanılan pullar cəmi bir neçə dəqiqə ərzində şəxsi hesabınıza köçürülür. Aktiv fəaliyyətinizə görə fərdi bonuslar və hədiyyələr qazana bilərsiniz. Dəstək xidməti həm çat, həm də e-poçt vasitəsilə kömək göstərir. 1xbet ailəsinə qoşulun və böyük uduşlar üçün ilk addımı atın. onlayn kazino

  • 砂岩白丘

    我一直梦想, 看到你们相册那样的地方。真棒。

  • 城市地標

    我喜欢, 这里分享真实经验。你的项目 就是 属于这里的。请继续。

  • 宗教地標

    我热爱这样的想法, 去那么多国家。真的很鼓舞。

  • 觀景高地

    能感受到热爱。继续保持 感受。

  • 最佳季節

    我关注这样的资源, 写得很实在。你的网站 就是 属于这里的。加油。

  • 1

    1

  • 1

    1

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

    1

日历

2026年07月

   1234
567891011
12131415161718
19202122232425
262728293031 

文章目录

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