今天实现了一个这样内容的UI需求,并记录一下思路与问题
首先左侧文字分为 ”限2行并省略” 与 “不限行数且不省略” 两种状态
而右侧文字分为 “展开 ∨” 与 “收起 ∧” 两种
实现效果是:通过点击右侧文字改变本身的文字,同时也改变左侧的文字状态
右侧文字:
<TextView
android:id="@+id/tv_btn_show"
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_weight="1"
android:gravity="center_horizontal|bottom"
android:drawableEnd="@mipmap/icon_down_gray"
android:text="展开"
android:textSize="12sp"
android:textColor="@color/gary_text"
android:visibility="invisible"
/>
右侧文字 状态1(展开 + 图像 icon_down_gray)
Drawable dra = getResources().getDrawable(R.mipmap.icon_down_gray);
btn_showFull.setText("展开");
dra.setBounds(0, 0, dra.getMinimumWidth(),dra.getMinimumHeight());
//设置drawableEnd之前 drawable必须setBounds
btn_showFull.setCompoundDrawables(null,null,dra,null);
右侧文字 状态2(收起 + 图像 icon_up_gray)
Drawable dra = getResources().getDrawable(R.mipmap.icon_up_gray);
btn_showFull.setText("收起");
dra.setBounds(0, 0, dra.getMinimumWidth(), dra.getMinimumHeight());
//设置drawableEnd之前 drawable必须setBounds
btn_showFull.setCompoundDrawables(null,null,dra,null);
左侧文字:
<TextView
android:id="@+id/txt3"
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_weight="5"
android:text="--"
android:textSize="12sp"
android:textColor="@color/gary_text"
android:maxLines="2"
android:ellipsize="end"
/>
左侧文字 状态1(限制行数、省略)
txt3.setMaxLines(2);//限制两行
txt3.setEllipsize(TextUtils.TruncateAt.END);//在尾部省略
左侧文字 状态2 (不限制行数、不省略)
txt3.setMaxHeight(mContext.getResources().getDisplayMetrics().heightPixels);//不限制大小
txt3.setEllipsize(null);//不省略
能用代码实现状态的变化后,简单的加个点击事件完成动作就行了
值得一提的还有另外一个点,在左侧文字少于或等于两行且不需要省略的时候,是不需要展示右侧的文字的
这个时候我想要知道的是如何区分开 左侧文字此刻 需要省略与不需要省略(在状态1的时候)
我先尝试找了一下有没有一个值可以判断TextView Ellipsize有没有处于使用状态
结果直接找出了如何判断现在是否处于省略状态
https://blog.csdn.net/wdd1324/article/details/80257390
同时对于里面提到的setText后立刻检查状态无效的情况,也稍微了解了一下
https://blog.csdn.net/ltym2014/article/details/52148751
最终这个展示与不展示右侧文字的行为我是这么实现了
txt3.post(new Runnable() {
@Override
public void run() {
Layout layout = txt3.getLayout();
if (layout != null) {
int countLine = txt3.getLineCount();//获取行数
if (countLine > 0) {
//获得最后一行被省略的内容数量,然后判断是不是大于0
if (layout.getEllipsisCount(countLine - 1) > 0)
{
//大于0则有省略内容
Utils.LogI("省略了");
btn_showFull.setVisibility(View.VISIBLE);
} else {
//等于0则没有省略内容
Utils.LogI("没省略");
btn_showFull.setVisibility(View.INVISIBLE);
}
}
}
}
});