TextView设置wrap_content时,使其宽高适应文字内容大小而不是适应background大小

来源:互联网 发布:c语言从1加到100while 编辑:程序博客网 时间:2024/05/22 07:40
对TextView设置wrap_content时,通常情况下其大小跟随文字内容大小,但如果对其设置了background属性,并且background是一张宽高较大的图片(大小超过了文字内容大小),发现此时TextView就会拉伸到和background图片等同大小,
有时我们需要这样的效果:如果background的初始图片很大,我们需要使其自动适应文字内容大小,而不会把TextView撑得很大

搜集和试验找到的方法有:
用.9图做background资源;
用shape做bakcground资源;
(图片小了自然就不存在撑大的问题了,但是改图片增加了体力劳动,也不是从根本上解决问题)

我发现把TextView的宽高写死时图片是可以自动变小的
那么只要我知道它没有设置background时的宽高(这时TextView的宽高是适应文字内容大小时的宽高),就可以在设置background后把这个宽高写上去,就可以动态的实现TextView大小适应文字内容大小而不是适应图片大小了

但是怎么才能知道TextView适应文字内容时的宽高呢?
本来想用正途,测量文字大小来获取宽高...未果
用了一个笨方法:
/**
     * textview设置wrap_content属性时,若background的内容过大,则textview的大小不跟随文字内容大小而跟随background大小
     * <p>
     * 若textview的background大小大于文字内容大小,该方法使textview的大小适应文字内容大小而不是适应background大小
     *
     * @param textView
     */
    public static void setWrapContentOfText(TextView textView) {
        Drawable drawable = textView.getBackground();
        textView.setBackground(null);


        textView.post(() -> {
            int width = textView.getWidth();
            int height = textView.getHeight();


            textView.setBackground(drawable);
            ViewGroup.LayoutParams layoutParams = textView.getLayoutParams();
            layoutParams.width = width;
            layoutParams.height = height;
        });
    }
流程就是,对设置了大图片作为background的TextView,先把background设置为空,这个时候TextView的大小就是适应文字内容时的大小

然后把背景图片设置回去,把得到的宽高值设置进去,就OK了


补充:

public static void setWrapContentNotOfBackground(View view) {    Drawable drawable = view.getBackground();    view.setBackground(null);    view.post(() -> {        int width = view.getWidth();        int height = view.getHeight();        view.setBackground(drawable);        ViewGroup.LayoutParams layoutParams = view.getLayoutParams();        layoutParams.width = width;        layoutParams.height = height;    });}
其实不止是TextView是这样,所有带background属性的View、ViewGroup都是如此

比如一个Layout设置了一个大图片为背景导致Layout大小被拉伸了,想要Layout的大小跟随其中的子控件而不是跟随background,也可以这样做


我发现androidSDK真的是有很多不完善的地方,我有印象的这是第三个了:ViewPager没有禁止滑动的API;TabLayout没有设置指示器宽度的API;TextView没有设置内容跟随文字不跟随background大小的API;
可能是考虑不周,测试不全造成的,现在就算更新API也没用,低版本的API都写死了,没法兼容,这也是Android和iOS相比的众多坑之一

阅读全文
0 0