Android:myTextView.getLineCount()/getHeight()=0?

Android:myTextView.getLineCount()/getHeight()=0?,android,textview,getline,Android,Textview,Getline,我想通过编程获得文本视图的高度或至少行数,但日志显示为0。怎么了?这是我的密码: public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_off); titreOff = (TextView) findViewById(R.id.offTitre); titreOff.setText

我想通过编程获得文本视图的高度或至少行数,但日志显示为0。怎么了?这是我的密码:

public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_off);

    titreOff = (TextView) findViewById(R.id.offTitre);
    titreOff.setText("some text"); // displays 2 lines of text with the font size I used
    System.out.println(titreOff.getLineCount() + " and " + titreOff.getHeight());
}
感谢您在
onCreate()
中的建议,您的
TextView
没有布局通行证,因此当前宽度和高度为零。如果您想获取
文本视图的维度,有几种解决方案:

  • OnGlobalLayoutListener
    添加到
    TextView
    ViewTreeObserver
    。(例如,
    titreOff.getViewTreeObserver().addOnGlobalLayoutListener(listener)
    并在那里处理您的更改)

  • 覆盖
    TextView
    并通过覆盖
    onLayout()
    来处理您的特殊情况(在这种情况下,
    TextView
    的尺寸将作为参数

  • 或者,您的测量的最终目标是什么?如果您能给出一些细节,可能有比这更简单的解决方案。

    onCreate()中
    ,您的
    TextView
    没有布局通行证,因此当前的宽度和高度为零。如果您想获得
    TextView的尺寸,有几种解决方案:

  • OnGlobalLayoutListener
    添加到
    TextView
    ViewTreeObserver
    (例如
    titreOff.getViewTreeObserver().addOnGlobalLayoutListener(listener)
    并在那里处理更改)

  • 覆盖
    TextView
    并通过覆盖
    onLayout()
    来处理您的特殊情况(在这种情况下,
    TextView
    的尺寸将作为参数


  • 或者,您的测量的最终目标是什么?如果您能给出一些细节,可能会有比这更简单的解决方案。

    您的应用程序在执行
    onCreate()
    方法时不知道
    TextView
    的实际大小。解决方案是将输出移到此处:

    onWindowFocusChanged(boolean hasFocus) {
        if (!hasFocus) {
            titreOff = (TextView) findViewById(R.id.offTitre);
            System.out.println(titreOff.getLineCount() + 
            " and " + titreOff.getHeight());
        }
    }
    

    在执行
    onCreate()
    方法时,您的应用程序不知道
    TextView
    的实际大小。解决方案是将输出移动到此处:

    onWindowFocusChanged(boolean hasFocus) {
        if (!hasFocus) {
            titreOff = (TextView) findViewById(R.id.offTitre);
            System.out.println(titreOff.getLineCount() + 
            " and " + titreOff.getHeight());
        }
    }
    
    setText()
    不会立即更新
    TextView
    ,它只是使其无效。新文本将仅在下次重新绘制时设置。如果您尝试在获取旧文本之前获取高度

    相反,您应该子类化
    TextView
    ,重写,并且每次更改
    TextView
    的大小时都会收到通知。

    setText()
    不会立即更新
    文本视图
    ,它只是使其无效。新文本将仅在下次重新绘制时设置。如果您尝试在获取旧文本之前获取高度


    相反,您应该子类化
    TextView
    ,重写,每次更改
    TextView
    的大小时,您都会收到通知。

    作为警告,不要犯我的错误,在侦听器中进行布局更改--这将导致它无限次地重新进入侦听器。如果确实需要在侦听器中进行布局更改,您应该删除自身中的侦听器(即
    titreOff.getViewTreeObserver().RemoveGlobalOnlyOutliner(此)
    方法中的
    onGlobalLayout()
    。选项#1工作不可靠(尽管视图包含文本,getLineCount在onGlobalLayout中返回0是很常见的)。您可能需要使用选项#2。作为警告,请不要犯我的错误并在侦听器中进行布局更改--这将导致侦听器无限次地重新进入侦听器。如果确实需要在侦听器中进行布局更改,则应删除侦听器本身(即
    titreOff.getViewTreeObserver().RemoveGlobalOnlyOutliner(this)
    onGlobalLayout()
    方法中。选项#1工作不可靠(尽管视图包含文本,getLineCount在onGlobalLayout中返回0是很常见的)。您可能需要使用选项#2。我了解您试图执行的操作,但当我执行此操作时,它仅在我退出视图时返回正确的值,而不是在我输入视图时返回正确的值…我了解您试图执行的操作,但当我执行此操作时,它仅在我退出视图时返回正确的值,而不是在我输入视图时返回正确的值…可能重复Possi不可复制的