如何在Android中从字符串中获取行号?
如何从字符串中获取行号?如何在Android中从字符串中获取行号?,android,Android,如何从字符串中获取行号? 假设我有一根这样的绳子 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中从
假设我有一根这样的绳子
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个或更多不同字符串的行号。
我怎么才能知道呢?试试下面的代码:
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);
这在渲染视图之前起作用。在布局时进行换行计算。因此:
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();
}
});
可以使用,或者更具体地说,可以使用。它不是ViewGroup
,而是TextView
等视图用来管理文本布局的类。它可以为您提供大量有关(文本)布局的信息,例如每行的位置,或者相反,特定行文本中的偏移量
显然,它需要知道可用的宽度,因此除非您事先知道(例如,您的文本使用整个屏幕宽度),否则您仍然需要等待(视图)布局
我不确定我是否完全理解你的问题。但您可以尝试使用反射来获取包装它的方法的行号
Method m; // the method object
ClassPool pool = ClassPool.getDefault();
CtClass cc = pool.get(m.getDeclaringClass().getCanonicalName());
CtMethod javassistMethod = cc.getDeclaredMethod(m.getName());
int linenumber = javassistMethod.getMethodInfo().getLineNumber(0);
可能也会修改变量的这个。不确定这是否解决了您的问题,甚至不知道您正在尝试做什么lol,但一旦编译,获取行号并不像读取原始文件那么容易,尤其是在启用模糊处理的情况下。在搜索之后,我终于找到了一个解决方案,这将需要一些时间,但我的实际问题已经解决
@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
}
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();
}
});
}
}
textLineCount
是一个全局变量。
这需要一些时间,但对我来说是有效的。你的意思是说“数几行”吗?你的问题不清楚你想要什么?显然,在渲染之前,无法获取行编号。不同的设备有不同的屏幕分辨率你的问题用词很奇怪。你的字符串显然是一行,除非你想用逗号把它切碎。你的意思是在你的Android视图中插入字符串后显示行号吗?无论如何,视图在渲染时会被指定一个大小,据我所知,没有办法事先得到它。可以做的是渲染它,获得大小,然后根据数据修改视图。我想某处有个像onPostCreate这样的钩子?查看活动生命周期。这不是实际的方式。这样,lines总是返回0。您的问题表明您希望在呈现给定字符串之前获取该字符串的行号,而您发布(并接受)的答案是如何在呈现多个视图后获取它们的总行数。根据你的问题,任何人都不可能提供一种方法来实现这一点。从@复制的答案有点误导。你要计算文本的总宽度,然后除以一行的宽度,这将得到行数。它被错误地标记为
int-width
,这导致了注释中的许多混乱。
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();
}
});
}
}
getTotalLineNumber();
new Handler().postDelayed(new Runnable() {
@Override
public void run() {
int totalLine = textLineCount;
// Here I have got the line number.
}
}, 1000);