字体对齐的textview

Last update: May 2, 2022

AlignTextView

字体对齐的TextView

Maven Central

截图

系统要求

Android 4.0以上

快速使用

build.gradle加入dependencies

compile 'me.codeboy.android:align-text-view:2.3.2'

AlignTextView (不支持选择复制,在不需要进行选择复制的情况下使用,排版效果好)

 <me.codeboy.android.aligntextview.AlignTextView
        android:id="@+id/alignTv"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"/>

CBAlignTextView (新的版本,支持选择复制,排版效果比较的好)

<me.codeboy.android.aligntextview.CBAlignTextView
        android:id="@+id/cbAlignTv"
        android:textIsSelectable="true"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"/>

如果需要支持android默认的选择复制,请在xml中加入以下代码:

android:textIsSelectable="true"

相关方法

1.CBAlignTextView

CBAlignTextView中增加了以下方法获取TextView的文本内容,请不要使用getText()获取

getRealText()

由于Android L(5.0)之后对中文的版本进行了变化,造成不能由中文标点作为行首,所以为了能够使CBAlignTextView看起来更加工整,建议将中文符号用英文符号替换(默认不转换),可以通过以下三种方式转化

  • 使用转化函数转化标点符号:

     CBAlignTextViewUtil.replacePunctuation(String text)
    
  • 在设置CBAlignTextView文本前(setText),调用以下方法:

     setPunctuationConvert(boolean convert)
    
  • 如果需要多次设置文本,或者复用组件(如RecyclerView中),在后面每次设置文本前,请调用以下方法:

    reset()
    
  • 可以直接在xml布局中进行设置

    <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
       xmlns:cb="http://schemas.android.com/apk/res-auto"
       android:layout_width="match_parent"
       android:layout_height="match_parent"
       android:orientation="vertical">
       <me.codeboy.android.aligntextview.CBAlignTextView
             android:id="@+id/cbAlignTextView"
             android:layout_width="match_parent"
             android:layout_height="wrap_content"
             cb:punctuationConvert="true"
             android:textIsSelectable="true"
             android:textSize="14dsp"/>    
     </LinearLayout>
    

2.AlignTextView

AlignTextView是旧的版本,不支持选择复制,但是可以自定义最后一行的对齐方式

setAlign(Align align)

设置每一段最后一行对齐方式,默认居左对齐,同时也可以在xml注释中设置对其方式:

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
          android:layout_width="match_parent"
  android:layout_height="match_parent"
  android:orientation="vertical">
  <me.codeboy.android.aligntextview.AlignTextView
        android:id="@+id/alignTextView"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        cb:align="center"
        android:textSize="14dsp"/>    
</LinearLayout>

使用说明

  1. 不用进行选择复制的时候使用 AlignTextView,需要进行选择复制的时候使用CBAlignTextView
  2. AlignTextViewCBAlignTextView在对齐的时候不会对英文单词等进行考虑,它们都是以字符(character)为基础的,不是词(word)。
  3. 使用CBAlignTextView时建议进行中文标点的转换。
  4. demo项目位与app下,可以单独提取出me.codeboy.android.aligntextview.AlignTextView和me.codeboy.android.aligntextview.CBAlignTextView使用。

更新历史

v2.3.2

  1. 修复CBAlignTextView多次设置文本后空行的问题。

v2.3.1

  1. 修复CBAlignTextView在xml中设置text时空指针问题。
  2. 修复CBAlignTextView设置空文本无效问题。

License

Copyright 2016 Yuedong.li

Licensed under the Apache License, Version 2.0 (the "License");
you may not use this file except in compliance with the License.
You may obtain a copy of the License at

   http://www.apache.org/licenses/LICENSE-2.0

Unless required by applicable law or agreed to in writing, software
distributed under the License is distributed on an "AS IS" BASIS,
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
See the License for the specific language governing permissions and
limitations under the License.

有任何问题,欢迎发送邮件到[email protected]交流.

GitHub

https://github.com/androiddevelop/AlignTextView
Comments
  • 1. CBAlignTextView在Listview或者Recyclerview中有时候settext无效bug

    CBAlignTextView在我的项目里Listview中,如果手指一直拖动listview滑动,屏幕显示外的第一条数据就不会显示,如果是随意滑动的话就会显示.(比如listview一个屏幕只能显示5条数据,那么我拖动listview往上滑,那么第6条数据滑进屏幕的时候CBAlignTextView是不显示text的,但是如果我是快速滑动一下就松开,那么第6条数据是可以显示的。)后面我特地从githup下了你的example运行下,发现你的example里也有无效的情况。

    screenshot_2018-01-04-14-13-08-250_me codeboy android aligntextview example

    Reviewed by DarkSherlock at 2018-01-04 06:23
  • 2. 底部空白问题 & 显示不全

    我在5.1.1的机器上还有6.0.1机型上跑 表现近乎完美,但是我用Gennymotion模拟器跑 低分辨率的设备上发现(480 * 800 还有960 * 540 )底部空白问题还是偶尔存在,系统版本号是4.1.1 . 我是用在recyclerview中的。而这个多余的空白表现的很明显,会错乱。同时也有时候会出现文字没有显示全就被截断了. 感觉是Line size 计算有问题

    Reviewed by asker517 at 2016-03-04 03:14
  • 3. ListView中item使用AlignTextView,5.0版本系统机器出现内容乱序现象

    你好,大神,开发中测试包了个TextView文本框显示文字右边没对齐的bug,感谢您的开源组件,使我快速解决这个问题。

    但是在测试过程中,发现Android系统版本4.1.2的三星机器,没出现问题,而Android系统版本5.0.2的三星机器出现乱序现象,具体表现为前面三项原先是A、B、C,列表下滑再回到顶部,前面三项变为B、A、C。初步怀疑是不是新版本系统优化TextView导致的。

    在下qq 1830560854,欢迎一起解决问题,:)。

    Reviewed by haichaoyuan at 2016-12-05 01:14
  • 4. !!! CBAlignTextView 在XML文件中setText有个 NullPointerException BUG

    CBAlignTextView 在XML文件中setText

    <com.shanbay.interview.functionCustomView.wediget.CBAlignTextView
        ...
        android:text="@string/shanbay_word"
        ...   />
    

    在文本转化方法 process() 中会报错, List 对象 addCharPosition 为 null。

    Reviewed by dreamfish797 at 2017-09-13 13:11
  • 5. 可以支持富文本

    在process(boolean setText)方法中的settext之前处理newText,例如 SpannableString spannableString = new SpannableString(newText); int a = newText.toString().indexOf(data); Log.e(TAG, "a=" + a); while (a != -1) { ForegroundColorSpan colorSpan = new ForegroundColorSpan(ContextCompat.getColor(getContext(), R.color.colorAccent)); spannableString.setSpan(colorSpan, a, data.length() + a, Spanned.SPAN_INCLUSIVE_EXCLUSIVE); a = newText.toString().indexOf(data, a + 1); Log.e(TAG, "a=" + a); } setText(spannableString);

    Reviewed by GuilinSir at 2019-07-23 08:38
  • 6. RecyclerView中使用AlignTextView或CBAlignTextView折叠展开错乱问题

    所有的item的AlignTextView或CBAlignTextView在XML中设置android:ellipsize="end"和android:maxLines="4"后,点击第一页屏幕内可以见点击item的展开显示全部内容后,上滑第二页的item可以见的时候,会有某天个item默认是展开显示全部内容的,内容文本显示也有些不对比如: EOS从5.2美元(这是原本内容中的某一个部分),显示时:EOS从5. 2美元(5.后面空格了一大tab键) 这是在adapter中设置的点击事件 holder.alignTextView.reset(); holder.alignTextView.setText(s); holder.alignTextView.setOnClickListener(new View.OnClickListener() { boolean flag = true; @Override public void onClick(View v) { if (flag) { flag = false; holder.alignTextView.setSingleLine(flag); holder.alignTextView.setEllipsize(null); // 展开 } else { flag = true; holder.alignTextView.setEllipsize(TextUtils.TruncateAt.END); // 收缩 holder.alignTextView.setMaxLines(4); } } });

    Reviewed by chenxiaofei910714 at 2018-12-05 03:10