当前位置:编程学习 > wap >>

如何在onCreate中获取TextView的宽度

前提条件是只有这个TextView的id

不希望使用xml方式 从布局xml文件中解析获取 那样感觉好麻烦 大家帮一下 --------------------编程问答-------------------- TextView tv = new TextView(this);
你有Id的话tv就自己先获取
tv.getMeasuredWidth();
tv.getMeasuredHeight();

我觉得这个应该可以吧。。。我不太懂。表喷我。。 --------------------编程问答-------------------- TextView tv = (TextView) findViewById(R.id.TextViewId);
tv.getWidth(); --------------------编程问答-------------------- 2楼的内容不行啊....
onCreate方法调用时候页面还没有出现 
而TextView在没有显示的时候获取到的宽度是0 .... --------------------编程问答-------------------- ...真是不想在去解析xml文件啦..... --------------------编程问答-------------------- 那你不要在onCreate中获取了在onResume中进行相关操作吧。楼主你还是说下你要实现什么效果或功能吧,或许是你的思路问题。 --------------------编程问答-------------------- mark一下。 --------------------编程问答-------------------- setContentView(R.layout.xml); oncreate方法  先执行这个  获得xml的资源  
TextView tv = (TextView) findViewById(R.id.TextViewId);
//TextViewId如果没有设置width
tv.setWidth();   


--------------------编程问答--------------------
引用 5 楼 peijiangping1989 的回复:
那你不要在onCreate中获取了在onResume中进行相关操作吧。楼主你还是说下你要实现什么效果或功能吧,或许是你的思路问题。

我要做的功能是取出Android系统自动换行导致的文字段落尾端不整齐效果 

比如下面的例子:
如果我想在textView中输出"1234567890 12345 12345" 这个tv一行可以输出10个文字,那么
系统不会输出
1234567890
12345 1234
5
而是输出
1234567890
12345
12345
这样闲的不整齐
为了解决这个问题 我自己写了一个方法修改tv中text的内容 在特定位置添加\n 比如上面的例子处理后的String就是"1234567890 1234\n5 12345"

由于是一个辅助模块 所以我实现这个功能区域限制在onCreate方法之内 不能在onResume()方法中

问题详细描述如上:
重申一下问题,免得跑题: 在onCreate()方法中 获取textView的文本显示宽度 也就是(width - paddingleft -paddingRight)后的结果 --------------------编程问答--------------------
引用 6 楼 fmworld 的回复:
mark一下。


本人新手... 好多术语不懂 ..... 弱弱的问一下 啥叫mark ....囧 请指导下 呵呵 --------------------编程问答-------------------- onCreate的确不能够得到各个控件的size,建议楼主在onCreate中启动一个线程,稍后去读取这个值。 --------------------编程问答--------------------
引用 10 楼 dairyman000 的回复:
onCreate的确不能够得到各个控件的size,建议楼主在onCreate中启动一个线程,稍后去读取这个值。


是一个办法 不过也的确麻烦 我们目前已经妥协了 将那个宽度作为参数传进方法里面了 之前想去自己手动解析xml布局文件来 但是还是感觉麻烦...哎 其实归根结底需要的就是获取xml文件中的那个参数 --------------------编程问答--------------------
引用 11 楼 swordnicety 的回复:
引用 10 楼 dairyman000 的回复:

onCreate的确不能够得到各个控件的size,建议楼主在onCreate中启动一个线程,稍后去读取这个值。


是一个办法 不过也的确麻烦 我们目前已经妥协了 将那个宽度作为参数传进方法里面了 之前想去自己手动解析xml布局文件来 但是还是感觉麻烦...哎 其实归根结底需要的就是获取xml文件中的那个参数



楼主你好,你的这个解决方法能写的再具体点不??我目前也在纠结这个问题,onCreate不是系统怎么调用的么?怎样做为参数传进去??参数的值怎样获取呢?? --------------------编程问答--------------------
引用 12 楼 wct_0303 的回复:
引用 11 楼 swordnicety 的回复:
引用 10 楼 dairyman000 的回复:

onCreate的确不能够得到各个控件的size,建议楼主在onCreate中启动一个线程,稍后去读取这个值。


是一个办法 不过也的确麻烦 我们目前已经妥协了 将那个宽度作为参数传进方法里面了 之前想去自己手动解析xml布局文件来 但是还是感觉麻烦...哎 其实归根结底需要的就是……



不不不 你理解错了 我说在onCreate()中当作参数传进去不是说onCreate(Object args) 而是 :
onCreate(){
 method(int width , .....);
}

是指 我这个方法的参数 不是onCreate()的参数 
宽度是自己在xml中定义的这个自己知道是多少 
所以说还是一个可行的办法 
但是这样子灵活性还是差了很多 --------------------编程问答--------------------
引用 9 楼 swordnicety 的回复:
引用 6 楼 fmworld 的回复:

mark一下。


本人新手... 好多术语不懂 ..... 弱弱的问一下 啥叫mark ....囧 请指导下 呵呵

哈哈, 就是标记一下, 关注一下的意思。 --------------------编程问答-------------------- 这个宽度确实可以自己设置,用length调整,但是和你输出格式没有什么关系啊,你遇见空格换行不就行了吗? --------------------编程问答-------------------- --------------------编程问答--------------------
引用 9 楼 swordnicety 的回复:
引用 6 楼 fmworld 的回复:

mark一下。


本人新手... 好多术语不懂 ..... 弱弱的问一下 啥叫mark ....囧 请指导下 呵呵

我也是新人 呵呵 ,mark就是标记一下。这个我知道 --------------------编程问答--------------------
引用 15 楼 fmworld 的回复:
这个宽度确实可以自己设置,用length调整,但是和你输出格式没有什么关系啊,你遇见空格换行不就行了吗?


没那么简单 比如文章内容如果是英文 总不能一个词一行把 目前Android系统默认将英文文字和数字合并后画到屏幕上 比如1234567890这个字符串 如果到'5'这个位置 这一行已经没有剩余空间那么 前面的1234也不输出 而是将"1234567890"作为一个整体 全部在下一行输出 这样上一行就剩余了"1234" 这么大的空白空间 显得很不好看 我要做的就是去除Android系统默认的整体输出  --------------------编程问答--------------------
引用 18 楼 swordnicety 的回复:
引用 15 楼 fmworld 的回复:

这个宽度确实可以自己设置,用length调整,但是和你输出格式没有什么关系啊,你遇见空格换行不就行了吗?


没那么简单 比如文章内容如果是英文 总不能一个词一行把 目前Android系统默认将英文文字和数字合并后画到屏幕上 比如1234567890这个字符串 如果到'5'这个位置 这一行已经没有剩余空间那么 前面的1234也不输出 而是将"……

o, 理解了。 --------------------编程问答-------------------- 那就用textedit.getLayoutParams().width  吧,  这个参数既可以直接赋值也可以直接引用。 --------------------编程问答-------------------- 在oncreate方法里面不是有一个setContentView吗? 你setContentView之后你再获取高度就不是0了 --------------------编程问答--------------------
引用 8 楼 swordnicety 的回复:
引用 5 楼 peijiangping1989 的回复:

那你不要在onCreate中获取了在onResume中进行相关操作吧。楼主你还是说下你要实现什么效果或功能吧,或许是你的思路问题。

我要做的功能是取出Android系统自动换行导致的文字段落尾端不整齐效果 

比如下面的例子:
如果我想在textView中输出"1234567890 12345 12345" 这个tv一行……


把width 值 放在 dimension裏面  通過 getResources().getDimension(id)去獲取
其實為什麽不對字符串去進行操作呢?
--------------------编程问答--------------------

TextPaint paint = tvText.getPaint(); 
int len = (int) paint.measureText(text); 
--------------------编程问答-------------------- 可以new一个线程,sleep一段时间,大概一秒左右,就能获取了,具体时间你慢慢睡眠时间慢慢调 --------------------编程问答-------------------- --------------------编程问答-------------------- 当你setContentView之后,然后再find到那个textview之后,
应该就能拿到。拿不到的话。你就在控件重绘后再获取 --------------------编程问答--------------------         ViewTreeObserver vto = mBtnSend.getViewTreeObserver();
        
        vto.addOnGlobalLayoutListener(new OnGlobalLayoutListener() {
            @Override
            public void onGlobalLayout() {
                int height = mBtnSend.getMeasuredHeight();
                int width = mBtnSend.getMeasuredWidth();
                System.out.println("height:" + height  + " " + "width:" + width);
            } 
        }); --------------------编程问答-------------------- 23楼完全正确!!!!! --------------------编程问答-------------------- 在onCreate()里是获取不到控件的width,height的,这个时候控件都没有measure,layout完毕,所以获取到的结果都是0。要获取控件的宽度、高度必须在measure、layout过程完毕之后。
有2种方法:
1.如lss所讲的一样:
ViewTreeObserver vto = mBtnSend.getViewTreeObserver();
    
  vto.addOnGlobalLayoutListener(new OnGlobalLayoutListener() {
  @Override
  public void onGlobalLayout() {
  int height = mBtnSend.getMeasuredHeight();
  int width = mBtnSend.getMeasuredWidth();
  System.out.println("height:" + height + "  " + "width:" + width);
  }  
  });

2.在Activity里重写方法
  public void onWindowFocusChanged(boolean hasFocus);
  在窗口第一次获得焦点的时候,肯定能获取到控件的width,height。 --------------------编程问答-------------------- 你为什么不设置一个静态的按钮试试看? --------------------编程问答-------------------- 用下面代码解决:


textView.getViewTreeObserver().addOnPreDrawListener(new OnPreDrawListener() {

        public boolean onPreDraw() {
//这里textView已经初始化完毕,你可以得到所有属性
        return true;
}
});
--------------------编程问答-------------------- 31楼才是正解嘛。。。。。 --------------------编程问答-------------------- 29楼的方法为整洁,正确 --------------------编程问答-------------------- 29楼和31楼的都是对的 --------------------编程问答-------------------- int intw=View.MeasureSpec.makeMeasureSpec(0,View.MeasureSpec.UNSPECIFIED);
int inth=View.MeasureSpec.makeMeasureSpec(0,View.MeasureSpec.UNSPECIFIED);
textView.measure(intw, inth);
int intwidth = textView.getMeasuredWidth();
int intheight = textView.getMeasuredHeight(); --------------------编程问答-------------------- 35楼也是正确的
补充:移动开发 ,  Android
CopyRight © 2012 站长网 编程知识问答 www.zzzyk.com All Rights Reserved
部份技术文章来自网络,