带有可选功能的浮动操作按钮实现

3

我创建了一个带有AppBarFloatingActionButtonRecyclerViewActivity。我实现了自己的FAB,因为我想让它可以被选中。这是我的代码:

public class CheckableFloatingActionButton extends FloatingActionButton implements Checkable {

    private static final int[] CHECKED_STATE_SET = {android.R.attr.state_checked};

    private boolean checked = false;
    private boolean broadcasting;

    private OnCheckedChangeListener onCheckedChangeListener;

    public interface OnCheckedChangeListener {

        void onCheckedChanged(CheckableFloatingActionButton fab, boolean isChecked);
    }

    public CheckableFloatingActionButton(Context context) {
        this(context, null);
    }

    public CheckableFloatingActionButton(Context context, AttributeSet attrs) {
        super(context, attrs);

        TypedArray a = context.obtainStyledAttributes(attrs, R.styleable.CheckableFloatingActionButton);
        setChecked(a.getBoolean(R.styleable.CheckableFloatingActionButton_checked, false));
        a.recycle();

    }

    @Override
    public void setChecked(boolean checked) {
        if (this.checked != checked) {
            this.checked = checked;
            refreshDrawableState();
            if (broadcasting) {
                return;
            }

            broadcasting = true;
            if (onCheckedChangeListener != null) {
                onCheckedChangeListener.onCheckedChanged(this, this.checked);
            }

            broadcasting = false;
        }
    }

    public void toggle(boolean animate) {
        if (animate) {
            setChecked(checked);
            return;
        }
        checked = !checked;
        jumpDrawablesToCurrentState();

    }

    public void setOnCheckedChangeListener(OnCheckedChangeListener listener) {
        onCheckedChangeListener = listener;
    }

    @Override
    public boolean performClick() {
        toggle();
        return super.performClick();
    }

    @Override
    public boolean isChecked() {
        return checked;
    }

    @Override
    public void toggle() {
        setChecked(!checked);
    }

    @Override
    public int[] onCreateDrawableState(int extraSpace) {
        final int[] drawableState = super.onCreateDrawableState(extraSpace + 1);
        if (isChecked()) {
            mergeDrawableStates(drawableState, CHECKED_STATE_SET);
        }
        return drawableState;
    }

}

在我滚动并隐藏/显示FAB之前,它是可以正常工作的。如您所见,FAB会动画绘制而不是立即设置。这就是为什么(我认为)出现了错误。有没有办法解决这个问题?

link

2个回答

1
Android Studio中的FloatingActionButtonBasic示例包括一个Checkable实现的FloatingActionButton。当您使用CollapsingToolbarLayout上下滚动时,它可以很好地工作。但我认为使用CompoundButton会是一种更加优雅的解决方案。

0
如果这是一个FloatingActionsMenu,你可以使用监听器来检测它是否展开或关闭。为什么不在它展开时使用监听器来检查"checked"参数是否为true,如果是,则填充可绘制对象。
 fam.setOnFloatingActionsMenuUpdateListener(new FloatingActionsMenu.OnFloatingActionsMenuUpdateListener() {
        @Override
        public void onMenuExpanded() {
          if(checked){
             //do something
          }
        }

        @Override
        public void onMenuCollapsed() {
        }
    });

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接