Android - 单例视图/复制状态

时间:2015-08-21 11:36:35

标签: android android-custom-view

我创建了一个自定义视图,其中包含两个投票按钮,竖起大拇指和竖起大拇指。

其中一个按钮可以一次处于活动状态,单击一个按钮可以禁用另一个按钮。

所有这些都可以,但是这些按钮可以在不同的地方使用,但都代表相同的项目。

是否可以在视图的所有实例中复制这些按钮的状态?那么当它在一个地方被点击时,那个投票状态会自动显示在其他地方吗?

这里有任何帮助。

感谢。

编辑:这是我的代码示例。这适用于每个单独的实例,但它们都是独立运作的。

public class VoteButtons extends RelativeLayout {

    OnVoteListener mListener;

    String playedItemId = null;

    View rootView;

    @Bind(R.id.vote_up_button)
    ImageButton voteUpButton;

    @Bind(R.id.vote_down_button)
    ImageButton voteDownButton;

    Context mContext;

    VoteState state = VoteState.VOTED_NONE;

    enum VoteState {
        VOTED_UP, VOTED_DOWN, VOTED_NONE
    }

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

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

        this.mContext = context;

        LayoutInflater inflater = (LayoutInflater) context
                .getSystemService(Context.LAYOUT_INFLATER_SERVICE);

        rootView = inflater.inflate(R.layout.vote_buttons, this, true);

        ButterKnife.bind(this, rootView);
    }

    @OnClick(R.id.vote_down_button)
    public void onClickVoteDown(ImageButton voteDownButton) {

        if(state == VoteState.VOTED_NONE) {
            state = VoteState.VOTED_DOWN;

            if(mListener != null && playedItemId != null)         mListener.onVoteDown(playedItemId);

            } else {

                state = VoteState.VOTED_NONE;

                if(mListener != null && playedItemId != null) mListener.onVoteCancel(playedItemId);
        }

        updateButtonStates();
    }

    @OnClick(R.id.vote_up_button)
    public void onClickVoteUp(ImageButton voteDownButton) {

        if(state == VoteState.VOTED_NONE) {
            state = VoteState.VOTED_UP;

            if(mListener != null && playedItemId != null) mListener.onVoteUp(playedItemId);

       } else {

            if(mListener != null && playedItemId != null) mListener.onVoteCancel(playedItemId);

            state = VoteState.VOTED_NONE;
        }

        updateButtonStates();
    }

    private void updateButtonStates() {
        switch(state) {
            case VOTED_UP:
                Drawable greenVoteUpDrawable = DrawableCompat.wrap(ContextCompat.getDrawable(mContext, R.drawable.ic_thumb_up_black_24dp).mutate());

                DrawableCompat.setTint(greenVoteUpDrawable, Color.parseColor("#7FD473"));

                voteUpButton.setImageDrawable(greenVoteUpDrawable);
            break;

            case VOTED_DOWN:
                Drawable greenVoteDownDrawable = DrawableCompat.wrap(ContextCompat.getDrawable(mContext, R.drawable.ic_thumb_down_black_24dp).mutate());

                DrawableCompat.setTint(greenVoteDownDrawable, Color.parseColor("#ED5756"));

                voteDownButton.setImageDrawable(greenVoteDownDrawable);
            break;

            case VOTED_NONE:

                // Show original drawables
                voteUpButton.setImageDrawable(ContextCompat.getDrawable(mContext, R.drawable.ic_thumb_up_black_24dp));
                voteDownButton.setImageDrawable(ContextCompat.getDrawable(mContext, R.drawable.ic_thumb_down_black_24dp));

                break;
        }
    }

    public void setOnVoteListener(OnVoteListener listener) {
        mListener = listener;
    }

    public interface OnVoteListener {
        void onVoteUp(String playedItemId);

        void onVoteDown(String playedItemId);

        void onVoteCancel(String playedItemId);
    }
}

1 个答案:

答案 0 :(得分:0)

是的,您可以将这两个按钮放在某个特定的布局中,并通过合并标记在其他布局中使用此布局。