实现“android button带loading”的步骤

概述

在Android开发中,我们经常会遇到需要在按钮点击时显示加载中的状态,以提高用户体验。本文将介绍如何实现一个带有加载中状态的按钮。

步骤概览

步骤 描述
1 创建一个自定义的Button类
2 添加一个加载中的布局
3 实现按钮的点击事件
4 处理加载中状态的显示和隐藏

详细步骤

步骤 1:创建一个自定义的Button类

首先,我们需要创建一个自定义的Button类,继承自Android原生的Button类。在该类中,我们将添加一些属性和方法,用于处理加载中状态的显示和隐藏。

public class LoadingButton extends AppCompatButton {
    private ProgressBar progressBar;

    public LoadingButton(Context context) {
        super(context);
        init();
    }

    public LoadingButton(Context context, AttributeSet attrs) {
        super(context, attrs);
        init();
    }

    public LoadingButton(Context context, AttributeSet attrs, int defStyleAttr) {
        super(context, attrs, defStyleAttr);
        init();
    }

    private void init() {
        // 初始化按钮的默认状态
        setEnabled(true);
    }
}

步骤 2:添加一个加载中的布局

为了在按钮点击时显示加载中的状态,我们需要在按钮上方添加一个ProgressBar作为加载中的布局。

public class LoadingButton extends AppCompatButton {
    private ProgressBar progressBar;

    public LoadingButton(Context context) {
        super(context);
        init();
    }

    public LoadingButton(Context context, AttributeSet attrs) {
        super(context, attrs);
        init();
    }

    public LoadingButton(Context context, AttributeSet attrs, int defStyleAttr) {
        super(context, attrs, defStyleAttr);
        init();
    }

    private void init() {
        // 添加ProgressBar作为加载中布局
        progressBar = new ProgressBar(getContext());
        addView(progressBar);
        
        // 设置ProgressBar的位置和大小
        LayoutParams params = (LayoutParams) progressBar.getLayoutParams();
        params.gravity = Gravity.CENTER;
        progressBar.setLayoutParams(params);
        
        // 默认隐藏ProgressBar
        progressBar.setVisibility(View.GONE);
    }
}

步骤 3:实现按钮的点击事件

为了能够响应按钮的点击事件,我们需要在自定义的Button类中重写performClick()方法,并在该方法中处理按钮的点击逻辑。

public class LoadingButton extends AppCompatButton {
    private ProgressBar progressBar;

    public LoadingButton(Context context) {
        super(context);
        init();
    }

    public LoadingButton(Context context, AttributeSet attrs) {
        super(context, attrs);
        init();
    }

    public LoadingButton(Context context, AttributeSet attrs, int defStyleAttr) {
        super(context, attrs, defStyleAttr);
        init();
    }

    private void init() {
        // 添加ProgressBar作为加载中布局
        progressBar = new ProgressBar(getContext());
        addView(progressBar);
        
        // 设置ProgressBar的位置和大小
        LayoutParams params = (LayoutParams) progressBar.getLayoutParams();
        params.gravity = Gravity.CENTER;
        progressBar.setLayoutParams(params);
        
        // 默认隐藏ProgressBar
        progressBar.setVisibility(View.GONE);
    }

    @Override
    public boolean performClick() {
        showLoading(); // 显示加载中状态
        boolean handled = super.performClick(); // 调用父类的点击事件处理
        hideLoading(); // 隐藏加载中状态
        return handled;
    }
}

步骤 4:处理加载中状态的显示和隐藏

最后,我们需要实现showLoading()hideLoading()方法,用于显示和隐藏加载中的状态。

public class LoadingButton extends AppCompatButton {
    private ProgressBar progressBar;

    public LoadingButton(Context context) {
        super(context);
        init();
    }

    public LoadingButton(Context context, AttributeSet attrs) {
        super(context, attrs);
        init();
    }

    public LoadingButton(Context context, AttributeSet attrs, int defStyleAttr) {
        super(context, attrs, defStyleAttr);
        init();
    }

    private void init() {
        // 添加ProgressBar作为加载中布局
        progressBar = new ProgressBar(getContext());
        addView(progressBar);
        
        // 设置ProgressBar的位置和大小
        LayoutParams params = (LayoutParams) progressBar.getLayoutParams();
        params.gravity = Gravity.CENTER;
        progressBar.setLayoutParams(params);
        
        // 默认隐藏ProgressBar
        progressBar.setVisibility(View.GONE);
    }

    @Override
    public boolean performClick() {
        showLoading(); // 显示加载中状态
        boolean handled = super.performClick(); // 调用父类的点击事件处理
        hideLoading(); // 隐藏加载中状态
        return handled;
    }

    private void showLoading