我有一个 TextView,它显示更改和运行时的文本。我想使用 View.getLineCount() 方法来查看 TextView 占用了多少行并相应地执行不同的功能。问题是我需要确定 TextView 在需要知道它占用多少行的相同方法中占用的行数。我试过在两次调用之间调用 View.invalidate() 但这似乎没有解决任何问题。如果可能的话,我想在不渲染 View 的情况下测量行数,但如果我必须渲染它,我也愿意这样做。让我知道这是否不够具体,我会尝试更具体。谢谢!
最佳答案
这在 Android 中实际上可能是一个非常复杂的问题。如果您需要在设置文本时知道(即在呈现 View 之前或接近呈现 View 之前),您唯一的选择是使用 StaticLayout。如果您可以等到接近渲染时间,您可以使用 viewTreeObserver:
yourTextView.getViewTreeObserver.addOnGlobalLayoutListener(new ViewTreeObserver.OnGlobalLayoutListener() {
@Override
public void onGlobalLayout(){
yourTextView.getLineCount();
}
}
onGlobalLayout 可以被多次调用,有时(无论出于何种原因)我发现 View 实际上还没有布局,所以你应该做一些日志记录,看看你是否能找到一种方法来确保无论结果如何你得到的实际上是有道理的(即行数 > 0)。
StaticLayouts 是一个更复杂的替代方案,它应该能够为您提供 View 的大小和行数。它们可能需要一些调整才能正常工作,并确保您使用的油漆来自您尝试测量的 View :
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 并尝试获取其中的行数。同样,与 View 树观察器一样,有时可以在实际测量 View 之前调用它们,因此您可能必须检查以确保在这些方法中获得的任何值都有意义。
关于Android:在渲染之前测量 View 的大小,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3376122/