Android获取TextView文本实际宽度

转自:http://blog.csdn.net/lizzy115/article/details/7513552

float textWidth = textView.getPaint().measureText(text) + PaddingLeft + PaddingRight; 

另外:

1)问题
      在Android中实现自适应的TableCtrl控件显示文字信息时,碰到有一个问题,就是需要得到一列中最长的字符串的宽度值。在网上搜索后,发现Android下可以利用 sdk 中已经提供的Paint的 measureText(String
text) 方法。于是尝试网上已经给出的代码:
Paint paint = new Paint();float strWidth = paint.measureText(String);
      控件中的各列按以上的调用并取得宽度的最大值,在设置后还是出现了字符串显示时被截断了,明显是返回的宽度值仍然偏小。难道与混杂的字体有关?有没有可能是这样产生的Paint实例只是用到了默认的值?

(2)解决的过程
     转念想到了Paint是画图时的重要元素,留意到熟悉的TextView中正是有这样的方法 getPaint() 返回的是TextPaint的实例(the base paint used for the
text.
Please use this only to consult the Paint‘s properties and not to change
them.) 
Paint的运用是与特定的Context中的资源相关联的,现在可以得到解决方案了。利用在TableCtrl中已经保存的Context(实际传入的
是Activity的实例),作如下调用:
view sourceprint?TextView textView = new TextView(mContext); 
Paint paint = textView .getPaint();
view sourceprint?float textWidth = paint.measureText(text);

经过测试,此时得到的textWidth值才是真正想要的。从而TableCtrl中单元格可以达到按最长的文字信息自动扩展显示。

(3)进一步的讨论
  

现在我们可以把注意力转向TextView,在它的构造器里面有重要的一个参数Context,看到其父类View的构造器中对参数Context的
解释:context, The Context the view is running in, through which it can
access the current theme, resources, etc. 至此容易看出View的显示是依赖于外部的Context的。
view sourceprint?public TextView (Context context, AttributeSet attrs, int defStyle)


      super(context, attrs, defStyle); 
      ... 
      mTextPaint = new TextPaint(Paint.ANTI_ALIAS_FLAG); 
      mTextPaint.density = getResource().getDisplayMetrics().density; 
      ... 
}

由以上TextView实现相关的部分源码,可以发现TextPaint与Context可用的资源实际上是紧密相关的,也就容易知道之前对measureText方法的调用出现了什么问题。

常常看到在Activity派生类的onCreate()方法中,我们通常需要调用setContentView()设置与当前的Activity相
关联的view进行显示,下面也大体看一下这个过程的发生:Activity的setContentView()方法实际交由其内部的成员
---Window类别的实例
mWindow来完成(注意到Window为抽象类,实际的mWindow是经过工厂方法产生的PhoneWindow的实例)。继续挖出
PhoneWindow重写setContentView()方法的相关源码:
view [email protected]
    public void setContentView(View view, ViewGroup.LayoutParams params) { 
        if (mContentParent == null) { 
            installDecor(); 
        } else { 
            mContentParent.removeAllViews(); 
        } 
        mContentParent.addView(view, params); 
        final Callback cb = getCallback(); 
        if (cb != null) { 
            cb.onContentChanged(); 
        } 
    }

而mWindow是作为在Activity中的top-level view被加入进来的,另外可以看到在设置完view之后,PhoneWindow 获取了初始注册的外部回调方法,此时触发调用实现对应的更新操作。

时间: 2025-01-08 10:54:16

Android获取TextView文本实际宽度的相关文章

android继承TextView的高度宽度计算问题

当需要扩展android原生TextView的时候,比如需要给TextView默认加上10像素的颜色边框时,当设置宽高为wrap_content时,高度并不好处理.网上大部分人云亦云的说设置一个默认值,然后根据测量模式,取 MeasureSpec.getSize(widthMeasureSpec)和默认值中的较小值,我想说就是扯淡.比如说我需要的宽度是200px,默认值是50px,此时宽度肯定不够.先看如下代码 package com.example.customview.view; impor

android获取textview展开渲染后的高度

当你需要获取textview真正高度时,相信会有不少人会在onCreate函数中调用textview的getHeight()方法,简单粗暴,确实,这是个很方便的方法,但是不幸的是textview在onCreate中根本还没有展开,所以根本获取不到textview的真正高度,因此我们需要给textview绑定一个监听器,在渲染结束后调用,方法如下: ViewTreeObserver observer = contentView.getViewTreeObserver(); observer.add

android获取textview的行数

最近项目需求,需要获取Textview的行数,通过行数与TextView的maxLines进行比较来确定是否显示TextView下方的展开按钮是否显示,废话少说直接上代码,mTextView.getLineCount() ,似乎很美好,安卓有提供这个方法,但是总是返回0,这是为啥呢?官方注释如下: /** * Return the number of lines of text, or 0 if the internal Layout has not * been built. */ 也就是说只

Android获取TextView显示的字符串宽度

工作上有业务需要判断textview是否换行,我的做法是判断textview要显示的字符串的宽度是否超过我设定的宽度,若超过则会执行换行. 项目中的其他地方也有这样的需求,故直接使用了那一块的代码.如下 public float getTextWidth(Context Context, String text, int textSize){ TextPaint paint = new TextPaint(); float scaledDensity = Context.getResource(

android获取对话框文本注意事项

1.View注意设置成final类型如final View layout=... 2.获取文本框对象时候格式EditText e = (EditText)layout.findViewById(R.id);//这里记好了那个layout 是上面final View对象 不注意上面的你就无法获得对话框中的文本了哦! private void getWifiInfo() { // TODO Auto-generated method stub /** * 当按返回键时的提示对话框,采用默认样式 */

android获取手机屏幕的宽度及高度

WindowManager wm = (WindowManager) context.getSystemService(Context.WINDOW_SERVICE); DisplayMetrics outMetrics = new DisplayMetrics(); wm.getDefaultDisplay().getMetrics(outMetrics); int mScreenWidth = outMetrics.widthPixels;//屏幕的宽度 int mScreenHeight

android获取控件宽高和屏幕宽高

一.获取屏幕宽高 1.android界面简单介绍 要获取屏幕宽高,我们可以先从android的界面构成了解 android的界面主要由三部分构成:1.状态栏 2.标题栏 3.内容区域 \ (1)状态栏 状态栏主要用来显示一些系统图标,应用的通知图标和系统时间. (2)标题栏 android中标题栏主要用来显示当前位置,3.0过后添加了ActionBar,拥有了导航和OptionMenu的功能,5.0又新添加了ToolBar控件,和ActionBar类似,但自定义的空间更充足 (3)内容区域 an

Android学习笔记-TextView(文本框)(一)

参考自文章:http://www.runoob.com/w3cnote/android-tutorial-textview.html 1.基础属性详解: id:为TextView设置一个组件id,根据id,我们可以在Java代码中通过findViewById()的方法获取到该对象,然后进行相关属性的设置,又或者使用RelativeLayout时,参考组件用的也是id! layout_width:组件的宽度,一般写:**wrap_content**或者**match_parent(fill_par

Android基础入门教程——2.3.1 TextView(文本框)详解

Android基础入门教程--2.3.1 TextView(文本框)详解 标签(空格分隔): Android基础入门教程 本节引言: 学习完Android中的六大布局,从本节开始我们来一个个讲解Android中的UI控件,本节给大家带来的UI控件是:TextView(文本框),用于显示文本的一个控件,另外声明一点,我不是翻译API文档,不会一个个属性的去扣,只学实际开发中常用的,有用的,大家遇到感觉到陌生的属性可以查询对应的API!当然,每一节开始都会贴这一节对应API文档的链接:TextVie