描述
该控件是为了满足对于长文本需要先显示部分,点击切换显示全部。
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 { // 开启状态
// ...
}
}
});