天天看点

TextView使用实例一、引用二、实例

第一次发文章好紧张哦,一定要我。

一、引用

1、 TextView实战之你真的懂我么? 2、 Android TextView 添加下划线的几种方式 3、 Android在一个TextView里显示不同样式的字体 4、 盘点Android使用自定义字体遇到的坑 5、 Android应用使用第三方字体

二、实例

1、完全靠xml布局实现的各式文字样式(超链接,下划线,滚动,阴影,拉伸,粗体斜体,图片加载)

图例:

TextView使用实例一、引用二、实例

tv-1.png

xml:

<!--part 1-->
        <LinearLayout
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:background="@color/white"
            android:orientation="vertical">

            <TextView
                style="@style/text_part_title_style"
                android:layout_margin="3dp"
                android:text="@string/textview_title_1" />
            <!--none|all|web|phone|mail|map-->
            <TextView
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:layout_margin="3dp"
                android:autoLink="web"
                android:text="www.baidu.com" />

            <!--代码跑起来才知道-->
            <TextView
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:layout_margin="3dp"
                android:text="@string/textview_line" />

            <TextView
                android:layout_width="100dp"
                android:layout_height="wrap_content"
                android:layout_margin="3dp"
                android:maxLength="8"
                android:text="测试长度1234566777" />

            <!--start,end,middle分别是在哪里省略,marquee是滚动,android4.x error-->
            <TextView
                android:layout_width="100dp"
                android:layout_height="wrap_content"
                android:layout_margin="3dp"
                android:ellipsize="marquee"
                android:focusable="true"
                android:focusableInTouchMode="true"
                android:marqueeRepeatLimit="marquee_forever"
                android:maxEms="8"
                android:singleLine="true"
                android:text="数据太长只能滚动看123456" />

            <TextView
                android:layout_width="100dp"
                android:layout_height="wrap_content"
                android:layout_margin="3dp"
                android:singleLine="true"
                android:text="测试单行test1234567890" />

            <TextView
                android:layout_width="100dp"
                android:layout_height="wrap_content"
                android:layout_margin="3dp"
                android:maxLines="2"
                android:text="测试最多2行test1234567890xxxxxx" />

            <TextView
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:layout_margin="3dp"
                android:digits="123456"
                android:text="测试只能数字test1234567890xxxxxx" />

            <TextView
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:layout_margin="3dp"
                android:hint="测试默认隐藏文字"
                android:textColorHint="@color/green" />

            <!--斜体在4.x上不行,要写nomospace?? , 阴影得运行才看得见-->
            <TextView
                android:layout_width="match_parent"
                android:layout_height="wrap_content"
                android:layout_margin="3dp"
                android:background="@color/wx_blue"
                android:drawableLeft="@mipmap/android_label"
                android:gravity="center"
                android:minHeight="30dp"
                android:padding="10dp"
                android:scaleY="1.2"
                android:shadowColor="@color/red"
                android:shadowDx="15.0"
                android:shadowDy="5.0"
                android:shadowRadius="2.5"
                android:text="布局实现:大小,颜色,最低高度,居中,背景色,内距,拉伸_文字间隔,阴影,粗体斜体,加载图片"
                android:textColor="@color/white"
                android:textSize="18sp"
                android:textStyle="italic|bold"
                android:typeface="monospace" />


        </LinearLayout>
           

2、textview和string.xml的部分使用(格式化文字和string-array)

TextView使用实例一、引用二、实例

tv-2.png

xml:

<!--part 2-->
        <LinearLayout
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:layout_marginTop="5dp"
            android:background="@color/white"
            android:orientation="vertical">

            <TextView
                style="@style/text_part_title_style"
                android:layout_margin="3dp"
                android:text="@string/textview_title_2" />

            <TextView
                android:id="@+id/tv_string"
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:layout_margin="3dp"
                android:text="@string/textview_string" />

            <TextView
                android:id="@+id/tv_string_format"
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:layout_margin="3dp"
                android:text="@string/textview_string_format" />

        </LinearLayout>
           

string.xml等:

<!--main-->
    <string-array name="android_study_modules">
        <item>组件</item>
        <item>控件</item>
        <item>数据库</item>
        <item>通信</item>
        <item>多媒体</item>
        <item>文件</item>
        <item>设备</item>
    </string-array>

<string name="textview_string_format">测试StringFormat:StringArray有%d个数据=%s,可测试Float=%2f</string>
           

代码:

/**
     * 测试string.xml的使用
     * XLIFF,全称叫 XML 本地化数据交换格式,英文全称 XML Localization Interchange File Format
     * */
    private void testStringXml(){
        //normal
        tv_string.setText(R.string.textview_string);

        //super
        String[] array_string = getResources().getStringArray(R.array.android_study_modules);
        LogUtil.i("array_string.length="+array_string.length+",content="+ Arrays.toString(array_string));

        String format_string = getString(R.string.textview_string_format);
        LogUtil.i("format_string org = "+format_string);
        format_string = String.format(format_string,array_string.length,Arrays.toString(array_string),3.333f);
        LogUtil.i("format_string java code = "+format_string);
        tv_string_format.setText(format_string);

        format_string = getString(R.string.textview_string_format,array_string.length,Arrays.toString(array_string),3.333f);
        LogUtil.i("format_string android code = "+format_string);
        tv_string_format.setText(format_string);
    }
           

3、代码实现各种文字样式(SpannableString的运用,文字内部超链接,下划线,滚动,阴影,拉伸,粗体斜体,图片加载,第三方字体,奇奇怪怪的文字)

TextView使用实例一、引用二、实例

tv-3.png

<!--part 3-->
        <LinearLayout
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:layout_marginTop="5dp"
            android:background="@color/white"
            android:orientation="vertical">

            <TextView
                style="@style/text_part_title_style"
                android:layout_margin="3dp"
                android:text="@string/textview_title_3" />

            <TextView
                android:id="@+id/tv_code_italic"
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:layout_margin="3dp"
                android:text="代码实现:斜体" />

            <TextView
                android:id="@+id/tv_code_bottom_line"
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:layout_margin="3dp"
                android:text="代码实现:下划线" />

            <TextView
                android:id="@+id/tv_code_autolink"
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:layout_margin="3dp"
                android:text="代码实现:AutoLinkALL" />

            <TextView
                android:id="@+id/tv_code_autolink2"
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:layout_margin="3dp"
                android:text="代码实现:定制化AutoLink" />

            <TextView
                android:id="@+id/tv_code_asset"
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:layout_margin="3dp"
                android:text="代码实现:第三方asset字体应用" />

            <TextView
                android:id="@+id/tv_code_fun_style"
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:layout_margin="3dp"
                android:text="代码实现:乱七八糟,大小上下颜色各不同的文字,真的很好玩" />

            <TextView
                android:id="@+id/tv_code_diff_style"
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:layout_margin="8dp"
                android:text="代码实现:大小,颜色,最低高度,居中,背景色,内距,拉伸_文字间隔,阴影,粗体斜体,加载图片" />


        </LinearLayout>
           
/**
     * 测试斜体
     * 貌似必须加上MONOSPACE,否则中文字无法斜体
     * */
    private void testItalic(){
        String aaa = tv_code_italic.getText().toString();

        /*方法1:全部是斜体粗体*/
        tv_code_italic.setTypeface(Typeface.MONOSPACE,Typeface.BOLD_ITALIC);

        /*方法2:部分斜体(中文字的话没法斜体)*/
        //SpannableString spn = new SpannableString(aaa);
        //what,start,end,flag
        //spn.setSpan(spn,0,3, Spannable.SPAN_EXCLUSIVE_EXCLUSIVE);
        //tv_code_italic.setText(spn);

        /*方法3:使用画笔(中文字的话没法斜体)*/
        //tv_code_italic.getPaint().setFakeBoldText(true);

    }

    /**
     * 测试中划线/下划线
     * */
    private void testTxtLine(){
        /*方法1:paint : STRIKE_THRU_TEXT_FLAG=中划线(删除线) , UNDERLINE_TEXT_FLAG=下划线*/
        tv_code_bottom_line.setPaintFlags(Paint.UNDERLINE_TEXT_FLAG);//getPaint().setFlags();
        tv_code_bottom_line.getPaint().setAntiAlias(true);//抗锯齿

        /*方法2:html标签类文字*/
        //String htmlString = "<u>我是html下划线</u>";
        //tv_code_bottom_line.setText(Html.fromHtml(htmlString));

        /*方法3:SpannablString类,一般用于某个文字下划线*/
        //String spanString = "我是spna文字,啦啦1234";
        //SpannableString content = new SpannableString(spanString);
        //content.setSpan(new UnderlineSpan(), 0, spanString.length(), 0);
        //tv_code_bottom_line.setText(content);
    }

    /**
     * 测试autoLink内容
     * none|web|phone|mail|map
     * */
    private void testAutoLink(){
        /*固定的 autolink all*/
        final String contact = "Email: [email protected]\n" +
                "Phone: 189111111111\n" +
                "Fax: +47-12345678\n" +
                "HTTP: http://www.baidu.com";
        tv_code_autolink.setAutoLinkMask(Linkify.ALL); // or set 'android:autoLink' in layout xml
        tv_code_autolink.setText(contact);

        /*定制的 autolink all*/
        //将TextView的显示文字设置为SpannableString
        tv_code_autolink2.setText(getClickableSpan());
        //设置该句使文本的超连接起作用
        tv_code_autolink2.setMovementMethod(LinkMovementMethod.getInstance());
    }


    //设置超链接文字
    private SpannableString getClickableSpan() {
        SpannableString spanStr = new SpannableString("使用该软件,即表示您同意该软件的使用条款和隐私政策");
        //设置下划线文字
        spanStr.setSpan(new UnderlineSpan(), 16, 20, Spanned.SPAN_EXCLUSIVE_EXCLUSIVE);
        //设置文字的单击事件
        spanStr.setSpan(new ClickableSpan() {
            @Override
            public void onClick(View widget) {
                //startActivity(new Intent(MainActivity.this, UsageActivity.class));
                ToastUtil.showShort(instance,"点击了使用条款");
            }
        }, 16, 20, Spanned.SPAN_EXCLUSIVE_EXCLUSIVE);
        //设置文字的前景色
        spanStr.setSpan(new ForegroundColorSpan(Color.GREEN), 16, 20, Spanned.SPAN_EXCLUSIVE_EXCLUSIVE);

        //设置下划线文字
        spanStr.setSpan(new UnderlineSpan(), 21, 25, Spanned.SPAN_EXCLUSIVE_EXCLUSIVE);
        //设置文字的单击事件
        spanStr.setSpan(new ClickableSpan() {
            @Override
            public void onClick(View widget) {
                //startActivity(new Intent(MainActivity.this, PrivacyActivity.class));
                ToastUtil.showShort(instance,"点击了隐私政策");
            }
        }, 21, 25, Spanned.SPAN_EXCLUSIVE_EXCLUSIVE);
        //设置文字的前景色
        spanStr.setSpan(new ForegroundColorSpan(Color.GREEN), 21, 25, Spanned.SPAN_EXCLUSIVE_EXCLUSIVE);

        return spanStr;
    }

    /**
     * 测试第三方asset中字体
     * 如果全局引用第三方字体两种比较好方式
     * 1、MyApplication通过反射定义此typeface,然后在theme中引用,然后套用此theme
     *    优化一点,可以通过注解+反射的方式,类似bufferfly框架中
     * 2、各种自定义控件中属性使用新typeface
     * 3、单个使用慢慢设置...
     *
     * 全局使用请看HelloApp.java这个Application文件
     * */
    private void testAssetFont(){
        //maybe exception
        Typeface ttf = Typeface.createFromAsset(getAssets(),"fonts/SIMKAI.TTF");
        tv_code_asset.setTypeface(ttf);
    }

    /**
     * 测试同一段文字显示乱七八糟有趣的
     * 主要是SpannableString
     * */
    private void testFunnyTextView(){
        String funnyString = tv_code_fun_style.getText().toString();
        SpannableString spna = new SpannableString(funnyString);
        // 字体颜色
        spna.setSpan(new ForegroundColorSpan(Color.RED), 0, 2, Spannable.SPAN_EXCLUSIVE_EXCLUSIVE);
        // 背景色
        spna.setSpan(new BackgroundColorSpan(Color.RED), 2, 4, Spannable.SPAN_INCLUSIVE_INCLUSIVE);
        // 粗体
        spna.setSpan(new StyleSpan(Typeface.BOLD), 4, 6, Spannable.SPAN_INCLUSIVE_INCLUSIVE);
        // 字体大小
        spna.setSpan(new AbsoluteSizeSpan(50), 6, 8, Spannable.SPAN_INCLUSIVE_INCLUSIVE);
        // 下划线
        spna.setSpan(new URLSpan(""), 8, 10, Spannable.SPAN_EXCLUSIVE_EXCLUSIVE);
        // 删除线(中划线)
        spna.setSpan(new StrikethroughSpan(), 10, 12, Spannable.SPAN_INCLUSIVE_INCLUSIVE);
        // 胖瘦字体
        spna.setSpan(new ScaleXSpan(2.0f), 12, 13, Spannable.SPAN_INCLUSIVE_INCLUSIVE);
        spna.setSpan(new ScaleXSpan(0.5f), 13, 14, Spannable.SPAN_INCLUSIVE_INCLUSIVE);
        // 显示
        tv_code_fun_style.setText(spna);
    }

    /**
     * 测试用代码输出风格迥异的文字
     * 设置各种尺寸要用到sp,dp和px,最多是px
     * */
    private void testTextViewCode(){

        //设置背景色,其他:setBackgroundResource(resid),setBackground(drawable)
        tv_code_diff_style.setBackgroundColor(AppUtil.getColor(instance,R.color.wx_blue));
        //设置字体颜色
        tv_code_diff_style.setTextColor(Color.WHITE);
        //设置大小
        tv_code_diff_style.setTextSize(18f);//默认用的sp为单位,不需要修改
        //设置宽度:非固定高度的,设置match_parent等需要从他父控件的param开始设置
        //tv_code_diff_style.setWidth(100);//pix
        LinearLayout.LayoutParams params = new LinearLayout.LayoutParams(
                LinearLayout.LayoutParams.MATCH_PARENT,
                LinearLayout.LayoutParams.WRAP_CONTENT);
        //params.width = 100;params.height=100;params.weight=1;
        tv_code_diff_style.setLayoutParams(params);
        //设置居中
        tv_code_diff_style.setGravity(Gravity.CENTER);
        //设置最低高度
        tv_code_diff_style.setMinHeight(DisplayUtil.dip2px(instance,30f));//pix
        //设置内距
        tv_code_diff_style.setPadding(10,10,10,10);
        //设置拉伸_文字间隔
        tv_code_diff_style.setScaleY(1.2f);//setScaleX
        //设置阴影
        tv_code_diff_style.setShadowLayer(2.5f,15f,5f,Color.RED);
        //设置斜体粗体
        tv_code_diff_style.setTypeface(Typeface.MONOSPACE,Typeface.BOLD_ITALIC);
        //设置加载图片
        Drawable drawable= getResources().getDrawable(R.mipmap.android_label);
        drawable.setBounds(0, 0, drawable.getMinimumWidth(), drawable.getMinimumHeight());//必有,不然不显示
        tv_code_diff_style.setCompoundDrawables(drawable,null,null,null);
    }
           

继续阅读