可切换显示状态的 TextView

描述

该控件是为了满足对于长文本需要先显示部分,点击切换显示全部。
clickView - 所代表是外部点击的 View;这样就将控件的切换触发与控件进行分离;

思想

  • 是通过动态设置 MaxLines 属性来控制的;
  • 通过 setToggleListener() 达到外部触发与状态绑定,并将最终状态返回

源码

/**
 * 允许控制文本的完全显示与否。
 */
public class ToggleTextView extends android.support.v7.widget.AppCompatTextView {

    private int closeLines;
    private boolean closed;
    private OnToggleListener toggleListener;
    private View clickView;

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

    public ToggleTextView(Context context, AttributeSet attrs) {
        this(context, attrs, 0);
    }

    public ToggleTextView(Context context, AttributeSet attrs, int defStyleAttr) {
        super(context, attrs, defStyleAttr);

        TypedArray a = context.obtainStyledAttributes(attrs, R.styleable.ToggleTextView, 0, 0);
        closeLines = a.getInt(R.styleable.ToggleTextView_closeLines, -1);
        closed = a.getBoolean(R.styleable.ToggleTextView_closed, false);

        if (closeLines <= 0) {
            // 行数应该是大于 1 的,故,对数据进行有效性处理.
            closeLines = Integer.MAX_VALUE;
            this.closed = false;
        }
        toggle();
    }

    public void setToggleListener(View clickView, OnToggleListener toggleListener) {
        this.clickView = clickView;
        this.toggleListener = toggleListener;

        this.clickView.setOnClickListener(new OnClickListener() {
            @Override
            public void onClick(View view) {
                toggle();
            }
        });
    }

    public void toggle() {
        if (this.closed) {
            // 关闭
            this.setMaxLines(closeLines);
        } else {
            // 开启
            this.setMaxLines(Integer.MAX_VALUE);
        }
        if (toggleListener != null) {
            toggleListener.toggle(this.closed);
        }
        this.closed = !this.closed;
    }

    public interface OnToggleListener {
        void toggle(boolean closed);
    }

}
<!-- 允许进行动态切换隐藏与否的控件 -->
<declare-styleable name="ToggleTextView">
    <!-- 设置最小显示的行数 -->
    <attr name="closeLines" format="integer" />
    <!-- 初始化显示的状态,是关闭还是开启 -->
    <attr name="closed" format="boolean"/>
</declare-styleable>

使用方法

可通过设置setToggleListener(clickView, new ToggleTextView.OnToggleListener() {}绑定需要触发显示状态变化的View,并获取状态变化后的回掉。

// layoutChange 是需要触发变化的 View
toggleTextView.setToggleListener(layoutChange, new ToggleTextView.OnToggleListener() {
    @Override
    public void toggle(boolean closed) {
        if (closed) { // 关闭状态
            // ...
        } else { // 开启状态
            // ...
        }
    }
});
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值