如何从Android中的字符串中获取行号?

时间:2018-02-08 09:52:42

标签: 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个或更多不同字符串的行号 我怎么能得到这个想法?

6 个答案:

答案 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
}