android中textview显示自汗,字母,数字乱行行问题解决

解决Android TextView文本内容自动换行问题 我的情况是放在GridLayout中,有的人可能是TableLayout,查了查网友的答案,有的设置TextView inputType多行multiline,省略号ellipsesize。后来想着还是使用换行符吧,检测放入的字符串的长度,然后加个换行符进去就行。本来想着用TextView来显示某个版本号,结果版本号异常的长, 阅读详情
原创作品,允许转载,转载时请务必以超链接形式标明文章  原始出处 、作者信息和本声明。否则将追究法律责任。 http://2960629.blog.51cto.com/2950629/636828

 

默认EditText和TextView自动换行。如果在string中出现了中文字符,排版出现意外,如图所示:

 

这是因为软盘默认的是半角输入,而字母与数字的占位与汉字不同,所以在默认的情况下会出现如上的排版情况。

但是如果将默认的半角变成全角之后就可以基本解决排版问题:

 

 

虽然全角看上去不好看,但是基本不会出现参差不齐。暂时没有找到其他的解决方法,如果不喜欢全角的效果,看来只能用canvas画上去了。。。

代码:

  mTextWrite = (EditText) findViewById(R.id.note_editor_write);// 得到写文本框
  //将输入的字母全部变成全角
  mTextWrite.setOnKeyListener(new EditText.OnKeyListener() {

   @Override
   public boolean onKey(View v, int keyCode, KeyEvent event) {
    // TODO Auto-generated method stub
    String temp = mTextWrite.getText().toString();
    mTextWrite.setText("");
    mTextWrite.append(ToSBC(temp));
    return false;
   }

  });

 // 半角转化为全角的方法
 public String ToSBC(String input) {
  // 半角转全角:
  char[] c = input.toCharArray();
  for (int i = 0; i < c.length; i++) {

   if (c[i] == 32) {
    c[i] = (char) 12288;
    continue;
   }
   if (c[i] < 127 && c[i]>32)
    c[i] = (char) (c[i] + 65248);

  }
  return new String(c);
 }

 // 全角转化为半角的方法

 public String ToDBC(String input) {
  char[] c = input.toCharArray();
  for (int i = 0; i < c.length; i++) {
   if (isChinese(c[i])) {
    if (c[i] == 12288) {
     c[i] = (char) 32;
     continue;
    }
    if (c[i] > 65280 && c[i] < 65375)
     c[i] = (char) (c[i] - 65248);
   }
  }
  return new String(c);
 }

 

ps:利用编码的方式判断字符是否为汉字的方法:

 private boolean isChinese(char c) {
  Character.UnicodeBlock ub = Character.UnicodeBlock.of(c);
  if (ub == Character.UnicodeBlock.CJK_UNIFIED_IDEOGRAPHS
    || ub == Character.UnicodeBlock.CJK_COMPATIBILITY_IDEOGRAPHS
    || ub == Character.UnicodeBlock.CJK_UNIFIED_IDEOGRAPHS_EXTENSION_A
    || ub == Character.UnicodeBlock.GENERAL_PUNCTUATION
    || ub == Character.UnicodeBlock.CJK_SYMBOLS_AND_PUNCTUATION
    || ub == Character.UnicodeBlock.HALFWIDTH_AND_FULLWIDTH_FORMS) {
   return true;
  }
  return false;
 }

 

pps:出现排版错误的另一个情况:

        android textview自动换行时为了保持单词的完整性,单词不会因为换行而断开。

解决方法:计算字符串长度,然后手动设定每一行显示多少个字母并加上‘\n‘

本文出自 “Alex_Michel” 博客,请务必保留此出处http://2960629.blog.51cto.com/2950629/636828



 转自:

  TextView会自动换行,而且排版文字参差不齐。查了下资料,总结原因如下:

  1、半角字符与全角字符混乱所致:这种情况一般就是汉字与数字、英文字母混用

  解决方法一:

  将textview中的字符全角化。即将所有的数字、字母及标点全部转为全角字符,使它们与汉字同占两个字节,这样就可以避免由于占位导致的排版混乱问题了。 半角转为全角的代码如下,只需调用即可。
public static String ToDBC(String input) {
  char[] c = input.toCharArray();
  for (int i = 0; i< c.length; i++) {
    if (c[i] == 12288) {
    c[i] = (char) 32;
     continue;
   }if (c[i]> 65280&& c[i]< 65375)
     c[i] = (char) (c[i] - 65248);
    }
  return new String(c);
}

  解决方法二:

  去除特殊字符或将所有中文标号替换为英文标号。利用正则表达式将所有特殊字符过滤,或利用replaceAll()将中文标号替换为英文标号。则转化之后,则可解决排版混乱问题。

  // 替换、过滤特殊字符
public static String StringFilter(String str) throws PatternSyntaxException{
  str=str.replaceAll("","]").replaceAll("!","!");//替换中文标号
  String regEx="[『』]"; // 清除掉特殊字符
  Pattern p = Pattern.compile(regEx);
  Matcher m = p.matcher(str);
return m.replaceAll("").trim();
}

  2、TextView在显示中文的时候标点符号不能显示在一行的行首和行尾,如果一个标点符号刚好在一行的行尾,该标点符号就会连同前一个字符跳到下一行显示。

  解决方法:在标点符号后加一个空格。

  3、一个英文单词不能被显示在两行中( TextView在显示英文时,标点符号是可以放在行尾的,但英文单词也不能分开 )。

  4、如果要两行对其的显示效果:有两种方法

  方法一:

  修改Android源代码;将frameworks/base/core/java/android/text下的StaticLayout.java文件中的如下代码:

  if (c == ' ' || c == '/t' ||
              ((c == '.' || c == ',' || c == ':' || c == ';') &&
               (j - 1 < here || !Character.isDigit(chs[j - 1 - start])) &&
               (j + 1 >= next || !Character.isDigit(chs[j + 1 - start]))) ||
              ((c == '/' || c == '-') &&
               (j + 1 >= next || !Character.isDigit(chs[j + 1 - start]))) ||
              (c >= FIRST_CJK && isIdeographic(c, true) &&
               j + 1 < next && isIdeographic(chs[j + 1 - start], false))) {
              okwidth = w;
              ok = j + 1;

  if (fittop < oktop)
                oktop = fittop;
              if (fitascent < okascent)
                okascent = fitascent;
              if (fitdescent > okdescent)
                okdescent = fitdescent;
              if (fitbottom > okbottom)
                okbottom = fitbottom;
            }

  去掉就可以了。去掉后标点符号可以显示在行首和行尾,英文单词也可以被分开在两行中显示。

  方法二:

  自定义View显示文本

  网上就有达人采用自定义View来解决这个问题,我做了实验并总结了一下:

  自定义View的步骤:

  1)继承View类或其子类,例子继承了TextView类;

  2)写构造函数,通过XML获取属性(这一步中可以自定义属性,见例程);

  3)重写父类的某些函数,一般都是以on开头的函数,例子中重写了onDraw()和onMeasure()函数;

  以下是代码

  =========================MyTextView2.java=============================

  public class MyTextView2 extends TextView{
private final String namespace = "";
private String text;
private float textSize;
private float paddingLeft;
private float paddingRight;
private float marginLeft;
private float marginRight;
private int textColor;
private Paint paint1 = new Paint();
private float textShowWidth;

  public MyTextView2(Context context, AttributeSet attrs) {
 super(context, attrs);
 text = attrs.getAttributeValue("", "text");
 textSize = attrs.getAttributeIntValue(namespace, "textSize", 15);
 textColor = attrs.getAttributeIntValue(namespace, "textColor",Color.WHITE);
 paddingLeft = attrs.getAttributeIntValue(namespace, "paddingLeft", 0);
 paddingRight = attrs.getAttributeIntValue(namespace, "paddingRight", 0);
 marginLeft = attrs.getAttributeIntValue(namespace, "marginLeft", 0);
 marginRight = attrs.getAttributeIntValue(namespace, "marginRight", 0);
 paint1.setTextSize(textSize);
 paint1.setColor(textColor);
 paint1.setAntiAlias(true);
 textShowWidth = ((Activity) context).getWindowManager().getDefaultDisplay().getWidth() - paddingLeft - paddingRight - marginLeft - marginRight;
}
@Override
protected void onDraw(Canvas canvas) {
 int lineCount = 0;
 text = this.getText().toString();//.replaceAll("\n", "\r\n");
 if(text==null)return;
 char[] textCharArray = text.toCharArray();
 // 已绘的宽度
 float drawedWidth = 0;
 float charWidth;
 for (int i = 0; i < textCharArray.length; i++) {
  charWidth = paint1.measureText(textCharArray, i, 1);
  
  if(textCharArray[i]=='\n'){
  lineCount++;
  drawedWidth = 0;
  continue;
  }
  if (textShowWidth - drawedWidth < charWidth) {
  lineCount++;
  drawedWidth = 0;
  }
  canvas.drawText(textCharArray, i, 1, paddingLeft + drawedWidth,
   (lineCount + 1) * textSize, paint1);
  drawedWidth += charWidth;
 }
 setHeight((lineCount + 1) * (int) textSize + 5);
}
}

  =======================main.xml===============================

  <RelativeLayout xmlns:android=""
  xmlns:tools=""
  android:layout_width="match_parent"
  android:layout_height="match_parent"
  android:background="@android:color/black" >

  <com.wigit.MyTextView2
    android:id="@+id/view"
    android:layout_width="fill_parent"
    android:layout_height="fill_parent"
    android:textColor="@android:color/white"
    android:textSize="20dip" />

  </RelativeLayout>

  =======================MainActivity.java=============================

  public class MainActivity extends Activity {
   MyTextView2 view;
  @Override
  public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);
    
    view = (MyTextView2) findViewById(R.id.view);
    view.setText(getAssetsString(this,"1.txt"));
    view.setMovementMethod(ScrollingMovementMethod.getInstance());
  }
public String getAssetsString(Context context,String fileName){
 StringBuffer sb = new StringBuffer();
 //根据语言选择加载
 try {
  AssetManager am = context.getAssets();
  InputStream in = am.open(fileName);
  BufferedReader reader = new BufferedReader(new InputStreamReader(in));
  String line;
  while((line = reader.readLine())!=null){
  line += ("\n");
  sb.append(line);
  }
  reader.close();
  in.close();
 } catch (IOException e) {
  e.printStackTrace();
 }
 return sb.toString();
}
}


Redis中什么是Big Key(大key)问题?如何解决Big Key问题? 通俗易懂的讲,Big Key就是某个key对应的value很大,占用的redis空间很大,本质上是大value问题。key往往是程序可以自行设置的,value往往不受程序控制,因此可能导致value很大。redis中这些Big Key对应的value值很大,在序列化/反序列化过程中花费的时间很大,因此当我们操作Big Key时,通常比较耗时,这就可能导致redis发生阻塞,从而降低redis性能。用几个实际的例子对大Key的特征进行描述:● 一个String类型的Key,它的值为5MB(数据过大); ● 一 阅读详情

相关推荐

自学ROS完成智能小车路径规划(一)--配置功能包

此系列文章记录本人学习ros的过程,将会尽可能详细以便自己能够看懂 参考系列:古月居老师,优快云,ROS tutorials,科大讯飞智能车竞赛线上赛 本文章的目标: 比较全局路径规划算法中A*算法与Dijkstra算法在该地图场景下的规划与运行时间 比较局部路径规划算法中DWA算法与TEB算法在该地图场景下的规划与运行时间 在同等参数条件下选择出各自适合的算法进行融合,经过比较,我将选择dijkstra算法作为全局路径规划算法,TEB算法为局部路径规划算法 第一步,按照科大讯飞的教程配置文件 科大讯

weixin_42621524的博客 9365

Android 文本框英文数字和汉字自动换行问题

Android 文字排版

qq_31469225的博客 4277

别再只会regress了!用Stata的csdid命令搞定多期DID的完整实操指南

本文详细介绍了如何在Stata中使用csdid命令进行多期DID分析,解决传统DID方法在交错处理场景下的局限性。通过完整的实操指南,包括环境搭建、核心语法、结果解读和高阶应用,帮助研究者更准确地评估政策效果,适用于计量经济学和实证研究领域。

weixin_30236595的博客 582

Android中自定义Textview解决文字和数字换行不整齐

效果图: 上面的是原生Textview,第一行末尾数字整体换行了, 下面是自定义Textview,第一行末尾数字分别在第一行和第二行展示 布局中 MyTextview记得换成自己包名下的 <TextView android:layout_margin="25dp" android:id="@+id/test_tv" an...

thw_m的博客 2660

安装cartographer,跑官网数据集

今天开始写一个关于google cartographer系列文章。此类文章网上已经很多,本系列文章主要记录重点部分及容易踩坑地方。 cartographer是一个完整的激光SLAM开源项目,属于graph slam,包含了完整的前端里程计和后端地图优化,既能够同时定位建图,又能够基于先验地图进行独立全局定位。 值得 目录 一、推荐首选看官网资料,已经很详细了 二、安装 三、源码文件架构 四、跑数据集 1、建图 2、基于先验地图的全局定位 一、推荐首选看官网资料,已经很详细了 原生版:

qq_18276949的博客 6144

Java + Selenium + TestNg + Allure Web UI 自动化

我们知道,在Python中针对Web UI自动化有Python + Selenium + Pytest/Unittest +Allure的技术栈。那么对于Java而言,也有其独特的Web UI 自动化技术栈。相同的,我们同样的运用Selenium框架,测试报告同样运用Allure。不同的是,我们运用的语言由Python转化为了Java,测试用例管理框架从Pytest转化为了TestNG。

qq_45594960的博客 1913

解决TextView中文英文数字混排导致的自动换行问题

Android原生的TextView,在某些特定的时候(我是在ListView的适配器里面),遇到中文和数字或者中文和英文一起混排的时候,会出现自动换行的现象。本来第一行还有很多空间可以显示,却莫名其妙地换行显示。经过网上的资料查找,需要继承TextView并重写OnDraw方法,具体代码如下: protected void onDraw(Canvas canvas) { TextPaint...

天花板的随笔 5493

SAP VC实战:用CU01和CS02搞定BOM里的‘智能’对象相关性(附语法避坑指南)

在工业制造领域,产品配置的复杂性往往超出想象。想象一下,当客户需要定制一台工业设备时,可能有数百种配置选项相互影响——从基础材质到动力系统,从控制模块到安全装置。如何在SAP系统中优雅地管理这种复杂性?对象相关性(Object Dependencies)就是解决这一挑战的利器。

weixin_42524824的博客 467

EditText单行、多行和自动换行显示内容以及只输入数字和小数点

先说说TextView的单行、多行的应用场景: 1) TextView默认是多行显示的,并且能够自动换行。不过自动换行时对中文处理的不是很好,很容易在控件边框附近出现空白间隙。要想处理这种情况只能够去自定义TextView了,具体可查看Android自定义view-文本自动换行。不过这种方式并不是很好,建议使用自带的StaticLayout类来对内容进行显示处理。 2) TextVie

洪勇坤的博客 5432

Coze+剪映小助手实战:5分钟搞定视频草稿创建工作流(附常见错误排查)

本文详细介绍了如何利用Coze平台与剪映小助手,通过create_draft接口快速搭建自动化视频草稿创建工作流。文章从核心价值、零基础搭建步骤、运行验证到深度错误排查,手把手教你5分钟内实现视频项目参数预设的标准化与自动化,显著提升短视频创作与团队协作效率。

oil88的博客 549

【Bluedroid】AVRCP 连接源码分析(一)

AVRCP连接源码分析流程是一个涉及多个步骤和协议交互的复杂过程。在源码中,需要仔细处理各种连接状态和协议交互,以确保AVRCP连接的稳定性和可靠性。同时,还需要根据具体的应用场景和需求,对AVRCP命令和响应进行定制化处理。

byte轻骑兵的技术小窝 3315

Android textview 英文自动换行

Android TextView 英文自动换行 在Android应用开发中,TextView是一个非常常用的组件,用于显示文本内容。尤其是在处理长文本时,如何正确地让文本自动换行是一项重要的任务。在这篇文章中,我们将探讨如何在TextView中实现英文自动换行,并提供代码示例。 什么是自动换行? 自动换行是指当文本的长度超...

weixin_40751842的博客 733

Aduino 通过I2C接口读取MPU6050模块数据

Aduino ESP9266通过I2C接口读取MPU6050模块数据 MPU6050模块 原理图 所需库:Adafruit_MPU6050 Adafruit_BusIO Adafruit Unified Sensor 接线示意图 ESP8266---MPU6050 VCC -- 3.3v GND -- GND D2 -- SDA D1 -- SCL 示例程序代码 #include <Adafruit_MPU6050.h> #include <Adafruit

perseverance51博客 621

【Android】TextView禁用单词自动换行功能

TextView默认不允许同一个单词拆成两行显示。

天天向上 Up Up Up (*^▽^*) 1268

Statistics and Machine Learning Toolbox

Statistics and Machine Learning Toolbox(带书签),MATLAB统计学习工具

NTscan扫描工具

ntscan是一个扫描器,可以扫描没有密码和弱密码的共享,先到配置文件中填写猜测的用户名和密码,扫描过程中右侧出现的是扫描日志。

Android TextView自动换行文字排版参差不齐的原因

今天项目没什么进展,公司后台出问题了。看了下刚刚学习Android时的笔记,发现TextView会自动换行,而且排版文字参差不齐。查了下资料,总结原因如下:   1、半角字符与全角字符混乱所致:这种情况一般就是汉字与数字、英文字母混用   解决方法一: 将textview中的字符全角化。即将所有的数字、字母及标点全部转为全角字符,使它们与汉字同占两个字节,这样就可以避免由于占位导致的排版...

蜗牛的编程路 2058

华为的C语言编程规范.pdf

华为技术有限公司内部技术规范。本规范制定了编写C语言程序的基本原则、规则和建议。从代码的清晰、简洁、可测试、安全、程序效率、可移植各个方面对C语言编程作出了具体指导。

android textview 英文 换行,android textview 怎么换行?

textView如果想要强制换行的话,必须先把TextView显示方式修改为多行(android:singleLine="false"),然后才能换行。方法一般用两种:1、在字符串里加入“\n”,如"abc\nrc";2、把TextView设置为固定宽度,然后让系统自动换行。如android:layout_width="100dp";扩展资料Class Overview向用户显示文本,并可选择允许...

weixin_36297266的博客 1265

锂电池充电器电路设计 里面有电路

锂电池充电器电路设计 里面有电路 3.7V升压到5V电路设计。

Android TextView自动换行文字排版参差不齐的原因及处理

TextView会自动换行,而且排版文字参差不齐。查了下资料,总结原因如下: 1、半角字符与全角字符混乱所致:这种情况一般就是汉字与数字、英文字母混用 解决方法一: 将textview中的字符全角化。即将所有的数字、字母及标点全部转为全角字符,使它们与汉字同占两个字节,这样就可以避免由于占位导致的排版混乱问题了。 半角转为全角的代码如下,只需调用即可。 public stati

进行式 4462

android textview 英文 自动换行,TextView设置文字包含中英文时自动换行问题的终极解决方案...

情景,正常TextView中设置文本内容中包含中英文时会造成自动换行的问题,影响界面显示效果,如图:网上很多解决途径,甚至有多三方框架处理,但是效果并不能达到,最终是要如下代码完美解决,效果图如下:具体实现过程 以及代码基本思路:先测量TextView的最大可用宽度,然后替换所有的空格符并按行分割,如果小于TextView最大宽度,则不处理;如果大于TextView最大宽度,进行单个字符进行测量,...

weixin_42371234的博客 4262

android textView 换行问题

Android的TextView在显示文字的时候有个问题就是一行还没显示满就跳到下一行,原因是: 1) TextView在显示中文的时候 标点符号不能显示在一行的行首和行尾,如果一个标点符号刚好在一行的行尾,该标点符号就会连同前一个字符跳到下一行显示; 2)一个英文单词不能被显示在两行中( TextView在显示英文时,标点符号是可以放在行尾的,但英文单词也不能分开 ); 如果只是想让标

longlongxy的专栏 1995

android textview全角,bug-textview半角,英文展示不全

在android的原生TextView中遇到如图所示等情况,由于特殊符号半角、或者字母串等等,TextView自动分割机制作出的效果并不美观。image.pngimage.png尝试方案:添加半角转全角后—一个数字或字母占两个字符,看似一行占满,但是间隙变大,视觉效果差。如下图image.pngimage.png最终解决方案:获取每一个字符测量长度,手动添加换行符。重新设置text。public ...

weixin_30792221的博客 783

解决Android中TextView多行显示的最后一行被遮住一半的bug

今天在coding某个app时,发现Textview在多行显示的时候,最后一行字只能显示出一半,找了网上的方法,许多都要重写TextView手动计算显示的行数。 其实并不用这么复杂,只需要将TextView的PaddingButtom设置一个切当的值即可解决(单行文字高度的一半就可以,例如10dp)。

pretender05的专栏 7345

Android 斜体字被裁切问题解决

一、提出问题 最近在使用UI小伙伴提供的字库的时候,发现由于这个字库是斜体的,在我将文字放置到我的checkbox(checkbox的本质是个textview)上面的时候,最后面的一个字总会被垂直地裁切掉一点。怎么调整布局都无法解决。 二、解决办法 方法一:比较简单粗暴的,在文本的最后添加一个空格,然后调整padding,也可以达到UI要求的样式。 方法二:如果你想探究下其他的方法,可以参考:带有wrap_contents的斜体TextView似乎在正确的edg处剪切了文本 - ITranslate

pc_LI 3636

Android中TextView的内容展示不全的问题

@[TOC](Android中TextView的内容展示不全的问题) # 简单的数学计算 在工作中第一次遇到新问题,我们可以尝试用讨巧的方式解决,而在第二次遇见的时候,注定了你要去探索它。——我说的。 这个问题乍一看其实是个很简单的计算问题:Android中在layout.xml中添加一个TextView,然后设置其字体大小,再设置其padding值,最后自然而然可以算出其应该占据的宽高。 ...

weixin_42477338的博客 6372

【我的Android进阶之旅】解决TextView的竖线分隔符和文字不对齐,向下偏移的问题

一、问题描述 今天UI小姐姐找到我,说有个界面的问题中的 竖线分隔符 与文本不对齐,有向下偏移的问题,如下所示: 可以明显看到,这个竖线分隔符 | 与文本不对齐,有明显向下偏移的问题。 <string name="login_problem_phone_and_password">找回密码&#160;&#160;&#160;|&#160;&#1...

字节卷动 6186

解决:Android TextView 设置斜体后右侧文字被遮挡

遇到一个比较奇怪的情况,给 TextView 文字设置倾斜后,右侧的文字会被遮挡,感觉这应该是 Android 的一个 bug!上效果图:可以明显地看到最右侧的文字被遮挡了。

Eric的博客 1898

Android设置大字体后文字被遮盖、显示补全问题解决

原先的字体单位SP,sp(与密度和字体缩放度无关的像素):与dp类似,但是可以根据用户的字体大小首选项进行缩放。 用户的字体设置放大时,会导致遮盖等问题出现。 解决方案一: 自动适应,不设置高度等信息。这导致程序开发和维护难度加大!因为实现谁也无法预知大小,局部要底对齐,导致界面布局非常麻烦,需要在程序运行时获取。多个对齐就要多次处理! 解决方案二: 经测试发现系统和一些应

键盘的起始页 5091
上一篇: Android 代码命名规范 -- 提高代码可以读性
下一篇: 安卓Home键封装监听
僤尐僤
博客等级 码龄14年 10粉丝 38原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值