Android一种常见的布局困扰

作者: 24K纯帅豆 | 来源:发表于2017-05-31 20:07 被阅读565次

    序言:步入社会之后有很多东西都变得身不由己了,比如说加班,放假之前的一个礼拜都处于加班的状态,加班归加班,但是问题还是得要记录一下的,话不多说,直接上图:

    图一
    图二

    相信大多数人都遇到过这样的需求,一个Item中的标题后面跟了一个标签,最多只能显示一行,而标签是首先需要展示的,也就是说标签必须展示完全,然后标题尽可能多的展示文字,一行不够的话就用...来代替。好了,让我们来分析一下:

    错解:这里特别说明一下,很多人就觉得直接让标签居右边显示然后标题在标签的左边占有剩下的布局就好了,当标题和标签的文字很短时,这样就不能让文字相互挨着了,所以这样做显然是行不通的;还有的人可能会觉得,用线性布局,标签自适应,标题设置权重就好了,这样做有可能的后果同上,当标题文字很短时,两边文字也不能相互挨着了,最后相信大部分人都会选择让UI去屎吧,设计的啥X玩意儿,但是人设计师会说IOS都实现了,你们Android应该也能实现的啊!WTF!!!骂过之后还是得乖乖的把它给实现,这就是程序猿的命啊!

    正解:抱怨完之后,咱们来想想有没有啥解决办法,首先我想到的是动态的给标题设置空间,先让标签布局好,然后计算掉标签所花费的空间,还有其他一些边距神马的,再计算屏幕的宽度,然后减去标签以及边距所占的空间,剩下的就是标题的空间了。那我们又是如何计算文字宽度的呢?

    获取文字宽度方法:

    TextPaint textPaintTitle=tvTitle.getPaint();
    //title是textview所展示的文字
    int textTitleWidth = (int) textPaintTitle.measureText(title);
    

    这样就可以获取textview的宽度了:

    private void setText() {
        tvTitle.setText(title);
        tvLabel.setText(label);
    
        textPaintTitle = tvTitle.getPaint();
        textPaintLabel = tvLabel.getPaint();
        int screenWidth = ScreenUtil.getScreenWidth(this);
        int textTitleWidth = (int) textPaintTitle.measureText(title);
        int textLabelWidth = (int) textPaintLabel.measureText(label);
        //这60dp是textview的一些边距神马的,具体可以去布局文件中计算
        int totalLeaveWidth = screenWidth - textLabelWidth - ScreenUtil.dp2px(this, 60.0f);
    
        if (textTitleWidth > totalLeaveWidth) {
            LinearLayout.LayoutParams params = (LinearLayout.LayoutParams) tvTitle.getLayoutParams();
            params.width = totalLeaveWidth;
        }
    }
    

    这样就可以解决上述的问题了:

    最终效果图 公众号:Android技术经验分享

    相关文章

      网友评论

      • 杨_moy:如果我再一个list中每个item都需要用到这个,楼主有没有考虑性能问题
        24K纯帅豆:暂时还没有考虑性能的问题,你有什么好的想法吗
      • PANGYAO:請問布局文件計算的意思,是會自己顯示,還是要我們自己相加
        24K纯帅豆:@PANGYAO 自己相加

      本文标题:Android一种常见的布局困扰

      本文链接:https://www.haomeiwen.com/subject/jcvdfxtx.html