如何在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);