我有一个 TextView 显示更改和运行时间的文本。我想使用 View.getLineCount() 方法来查看 TextView 占用了多少行并相应地执行不同的功能。问题是我需要确定 TextView 占用的行数,方法与需要知道它占用多少行的方法相同。我曾尝试在两次调用之间调用 View.invalidate() ,但这似乎并没有解决任何问题。如果可能的话,我想在不渲染视图的情况下测量行数,但如果我必须渲染它,我也愿意这样做。让我知道这是否不够具体,我会尝试更具体。谢谢!
问问题
3004 次
1 回答
1
这实际上可能是 Android 中一个非常复杂的问题。如果您需要在设置文本时知道(即在呈现视图之前或即将呈现视图之前),那么您唯一真正的选择是使用 StaticLayout。如果您可以等到接近渲染时间,您可以使用 viewTreeObserver:
yourTextView.getViewTreeObserver.addOnGlobalLayoutListener(new ViewTreeObserver.OnGlobalLayoutListener() {
@Override
public void onGlobalLayout(){
yourTextView.getLineCount();
}
}
onGlobalLayout 可以多次调用,有时(无论出于何种原因)我发现视图实际上还没有布局,所以你应该做一些日志记录,看看你是否能找到一种方法来确保你得到的任何结果实际上有意义(即行数> 0)。
StaticLayouts 是一个更复杂的替代方案,它应该能够为您提供视图的大小和行数。他们可能需要一些调整才能正常工作,并确保您使用您尝试测量的视图中的油漆:
yourTextView.setText(newText);
//the last boolean should be true if you're using padding on your view
StaticLayout measure = new StaticLayout(yourTextView.getText(), yourTextView.getPaint(),
maxAvailableWidthForYourTextView, Layout.Alignment.ALIGN_NORMAL, 1.0f, 1.0f, false)
int numberOfLines = measure.getLineCount();
如果您愿意(或已经拥有)子类 TextView,您可以覆盖 onSizeChanged 或 onMeasure 并尝试获取那里的行数。同样,与视图树观察者一样,有时可以在实际测量视图之前调用它们,因此您可能必须检查以确保在这些方法中获得的任何值都是有意义的。
于 2012-02-25T04:59:48.253 回答