如何将行号换成字符串?
假设我有一个像这样的字符串
String testString = "Lorem ipsum dolor sit amet, consectetuer adipiscing elit. Aenean commodo ligula eget dolor. Aenean massa. Cum sociis natoque penatibus et magnis dis p";
我还有一个会显示字符串的视图。在另一种情况下,我想在渲染之前先获取行号 我想从Android中获取此字符串中的行号。我有几种方法可以获得行号。但在每个解决方案中,我们都可以在视图渲染后获取行号。但是在渲染视图之前我想要它。我想获得20个或更多不同字符串的行号 我怎么能得到这个想法?
答案 0 :(得分:8)
布局时会发生换行计算。因此:
findViewById(R.id.myTextView).addOnLayoutChangeListener(new View.OnLayoutChangeListener() {
@Override
public void onLayoutChange(View v, int left, int top, int right, int bottom, int oldLeft, int oldTop, int oldRight, int oldBottom) {
int lineCount = ((TextView)v).getLayout().getLineCount();
}
});
答案 1 :(得分:5)
您可以使用android.text.Layout
,或更具体地说android.text.StaticLayout
。它不是ViewGroup
,而是像TextView
这样的视图用来管理文本布局的类。它可以为您提供有关(文本)布局的大量信息,例如每行的位置,或相反的特定行文本中的偏移量。
显然它需要知道可用的宽度,所以除非你事先知道它(例如你的文本使用整个屏幕宽度),你仍然需要等待(视图)布局。
float density = getResources().getDisplayMetrics().density;
// information about the font
TextPaint paint = new TextPaint();
paint.setTextSize(18 * density);
int width = (int) (300 * density);
Layout.Alignment alignment = Layout.Alignment.ALIGN_NORMAL;
StaticLayout layout = new StaticLayout(text, paint, width, alignment, 1, 0, false);
int lines = layout.getLineCount();
答案 2 :(得分:4)
试试这段代码:
Rect bounds = new Rect();
Paint paint = new Paint();
paint.setTextSize(textSize);
paint.getTextBounds(str, 0, str.length(), bounds);
int linesCount = (int) Math.ceil((float) bounds.width() / textSize);
这在渲染视图之前有效。
答案 3 :(得分:2)
不确定我完全理解你的问题。但是你可以尝试使用反射来获取包装它的方法的行号。
android:textColor="?attr/editTextColor"
也可以修改变量。不确定这是否解决了你的问题,甚至是你想要做什么大声笑,但是一旦编译,获取行号并不像读取原始文件那么容易,特别是如果你启用了混淆。
答案 4 :(得分:0)
最后搜索后我得到了一个需要一些时间的解决方案,但我的实际问题已经解决了。
public void getTotalLineNumber() {
RelativeLayout linearLayout = findViewById(R.id.layout_constraint);
textHeight = 0;
for (int i = 0; i < stringList.size(); i++) {
final TextView tv = new TextView(this);
tv.setText(stringList.get(i));
tv.setLayoutParams(new RelativeLayout.LayoutParams(RelativeLayout.LayoutParams.MATCH_PARENT, RelativeLayout.LayoutParams.WRAP_CONTENT));
tv.setTextSize(15);
tv.setTypeface(tv.getTypeface(), Typeface.BOLD);
tv.setVisibility(View.INVISIBLE);
RelativeLayout.LayoutParams params = (RelativeLayout.LayoutParams) tv.getLayoutParams();
params.setMargins(8, 5, 16, 5); //substitute parameters for left, top, right, bottom
tv.setLayoutParams(params);
linearLayout.addView(tv);
tv.post(new Runnable() {
@Override
public void run() {
textLineCount += tv.getLineCount();
}
});
}
}
最后,我从postHandler获得了总行数。
getTotalLineNumber();
new Handler().postDelayed(new Runnable() {
@Override
public void run() {
int totalLine = textLineCount;
// Here I have got the line number.
}
}, 1000);
textLineCount
是一个全局变量。
这需要一些时间,但对我有用。
答案 5 :(得分:-2)
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
// Get the widgets reference from XML layout
mTextView = (TextView) findViewById(R.id.tv);
// Get TextView Line numbers
int lines = mTextView.getLineCount();
//your other code
}