背景

这次呢,主要是消息页面的问题,场景是有人点赞了自己发布的内容,然后消息也就会收到一个提示,一个红色的小圆点里面还标有数字。这个倒是容易实现,问题就处在查看了消息之后,这个小圆点不消失了,因为我是引用的是一个叫BadgeView的第三方框架,所以我就去Github上面去看看是不是我用错了或者是怎样,我在他的介绍当中清清楚楚的看到了这一行 Badge数字小于0时显示dot,等于0时隐藏整个Badge,在普通模式下超过99时显示99+,精确模式下显示具体值 ,但是我在用的时候Badge数字等于0时Badge是没有隐藏的,我当时想算了,我看看他这儿有没有其他可以设置隐藏的方法,他的方法有一个是hide(),给出的解释是隐藏Badge,那我就写了一个判断,当Badge数字等于0时,就调用这个hide的这个方法,然后还是失败了,我还特意打印输出看Badge的值是不是等于0,既然这个方法不行那我就试试其他的吧,然后我就通过Badge.getTargetView这个方法去获取TargetView然后用setVisibility设置他隐藏,然而还是没有解决。。。我在博客上看到过说是要把这个Badge和它绑定在一起的元素一起隐藏,于是我就试了试,发现这个问题更大,连收到的点赞这个都给我隐藏了,然后我又继续搜继续看,反反复复失败了好几个小时之后,突然灵光乍现,既然这个引入的框架不好用,那我就自己写一个咯,刚好看了挺多博客脑子里也还是有一点想法的。我是这样想的,我在消息页面里加入了一个TextView用来显示小圆点,然后在页面上写一个判断,当有消息提示的时候就显示并赋值消息数字,没有消息就不显示小圆点。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
//这个是小圆点的代码
<TextView
android:id="@+id/zan_no_read"
android:text="1"
android:textSize="8sp"
android:textColor="@color/white"
android:layout_toRightOf="@+id/zan"
android:layout_width="13dp"
android:layout_centerVertical="true"
android:gravity="center"
android:visibility="gone"
android:background="@drawable/badge_view"
android:layout_height="13dp" />


//这个是创建了一个drawable这个TextView变成一个红色的小圆点
<?xml version="1.0" encoding="utf-8"?>
<shape xmlns:android="http://schemas.android.com/apk/res/android">
<!--android:shape="rectangle"-->
<!-- 圆角的半径 -->
<corners android:radius="50dp"/>

<!-- 填充颜色 -->
<solid android:color="@color/tt_skip_red"/>


</shape>

这个问题的解决让我思考了一个问题,有时候我们在引入别人写好的一个第三方的插件的时候,很多时候遇到问题的时候,惯性的思维就是,是不是自己哪儿没有写好才会导致出现问题,总之产生问题的一切原因都是出在自己身上,但其实别人写的也没有那么完美,也会有一些问题的产生,而且有的时候一个很简单的问题也不要想的过于复杂化,明明几行就能解决的问题,还有一点就是希望自己不要太过于依赖框架,尽可能的自己去想去写。

顺便还记录一下一个问题,就是Android获取TextView行数getLineCount()返回的是0,也是昨天在修改的过程中发现,我们直接使用TextView.getLineCount()方法返回的是0,下面是他的源码注释,意思就是如果这个TextView还没有被画出来,则返回的是0,所以我们需要异步执行下,拿到linecount。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
/**
* Return the number of lines of text, or 0 if the internal Layout has not
* been built.
*/
public int getLineCount() {
return mLayout != null ? mLayout.getLineCount() : 0;
}

//这个就是异步执行了,可以拿到TextView的行数
post(new Runnable() {

@Override
public void run() {
int lineCount = mTextView.getLineCount();
}
});