Android中的多列文本显示

Android中的多列文本显示,android,android-layout,Android,Android Layout,我想在2列中显示文本 例如,我有一个大字符串,第一个字符串加在第一列,在屏幕高度结束后,文本应该加在第二列。就像新闻记者一样 我尝试了下面的代码,但它给了我java.lang.StringIndexOutOfBoundsException java代码 final TextView tvl = (TextView)findViewById(R.id.textl); final TextView tvr = (TextView)findViewById(R.id.textr); f

我想在2列中显示文本

例如,我有一个大字符串,第一个字符串加在第一列,在屏幕高度结束后,文本应该加在第二列。就像新闻记者一样

我尝试了下面的代码,但它给了我java.lang.StringIndexOutOfBoundsException

java代码

final TextView tvl = (TextView)findViewById(R.id.textl);
    final TextView tvr = (TextView)findViewById(R.id.textr);
    final String text = "sdf";
    tvl.post(new Runnable() {
    @Override
    public void run() {
    TextMeasure(text,tvl,tvr);
    }
    });
private void TextMeasure(String text,
            TextView tvl,TextView tvr) {
            // Get number of lines of text that will fit on the screen
            int linesPerScreen = tvl.getHeight()/(tvl.getLineHeight() );
            // Measure how much text will fit across the TextView
            Paint paint = tvl.getPaint();
            int textWidth = paint.breakText(text, 0, text.length(),
            true, tvl.getWidth(), null);
            // Total amount of text to fill the TextView is
            // approximately:
            int totalText = textWidth * linesPerScreen;
            String leftText = text.substring(0,totalText);
            String rightText = text.substring(totalText,
            text.length());
            tvl.setText(leftText);
            tvr.setText(rightText);
            }
xml



在尝试从文本获取子字符串之前,请确保totalText变量小于text.length()

您可以使用表行并在其中插入TextView。然后将字符串分成两部分,并将它们放在相邻放置的两个textview中

<TableRow>

   <TextView
        android:text=""
        android:id="+id/col1"
        android:padding="10dip" />

    <TextView
        android:text=""
        android:id="+id/col2"
        android:gravity="right"
        android:padding="10dip" />

</TableRow>

将字符串分成两部分后,将它们放在TableLayout的两个TextView中


这会奏效的

我刚刚创建了一个示例项目,将文本呈现到多个列:

这种方法使用android/text/Layout类来格式化和绘制文本

protected void onDraw(Canvas canvas) {
    if(mTextLayoutNeeded) {
        createLayouts(getWidth(), getHeight());
    }
    super.onDraw(canvas);
    canvas.save();
    canvas.translate(getPaddingLeft(), getPaddingTop());
    for(Layout l : layouts) {
        l.draw(canvas);
        canvas.translate(mColumnWidth, 0);
        canvas.translate(mSpacing, 0);
    }
    canvas.restore();
}

private void createLayouts(int width, int height) {
    layouts.clear();
    if(mText == null) {
        return;
    }
    int availableWidth = getWidth() - getPaddingLeft() - getPaddingRight();
    int availableHeight = getHeight() - getPaddingTop() - getPaddingBottom();
    Layout masterLayout = createLayout(mColumnWidth, mText, mPaint);
    int startLine = 0;
    int usedWidth = 0;
    while(usedWidth < availableWidth - mSpacing - mColumnWidth) {
        int startLineTop = masterLayout.getLineTop(startLine);
        int endLine = startLine;
        for(int i = startLine; i < masterLayout.getLineCount(); i++) {
            if(masterLayout.getLineBottom(i) - startLineTop < availableHeight) {
                endLine = i;
            } else if(endLine == startLine) {
                //A large image can be larger than the available height, skip the content
                Toast.makeText(getContext(), "Skipping too large content", Toast.LENGTH_SHORT).show();
                startLine++;
                startLineTop = masterLayout.getLineTop(startLine);
                endLine = startLine;
            } else {
                break;
            }
        }
        int columnStart = masterLayout.getLineStart(startLine);
        int columnEnd = masterLayout.getLineEnd(endLine);
        layouts.add(createLayout(mColumnWidth, mText, columnStart, columnEnd, mPaint));
        if(endLine == masterLayout.getLineCount() - 1) {
            break;
        }
        usedWidth += mColumnWidth;
        startLine = endLine;
    }
    mTextLayoutNeeded = false;
}

private static Layout createLayout(int width, CharSequence text, TextPaint paint) {
    return new StaticLayout(text, 0, text.length(), paint,
            width, Layout.Alignment.ALIGN_NORMAL, 1f, 0, true);
}

private static Layout createLayout(int width, CharSequence text, int offset, int end, TextPaint paint) {
    return new StaticLayout(text, offset, end, paint,
            width, Layout.Alignment.ALIGN_NORMAL, 1f, 0, true);
}
受保护的void onDraw(画布){
如果(MTextLayoutRequired){
createLayouts(getWidth(),getHeight());
}
super.onDraw(帆布);
canvas.save();
translate(getPaddingLeft(),getPaddingTop());
用于(布局l:布局){
l、 绘画(画布);
canvas.translate(mColumnWidth,0);
canvas.translate(mSpacing,0);
}
canvas.restore();
}
专用void createLayouts(整数宽度、整数高度){
布局。清除();
if(多行文字==null){
返回;
}
int availableWidth=getWidth()-getPaddingLeft()-getPaddingRight();
int availablewhight=getHeight()-getPaddingTop()-getPaddingBottom();
Layout masterLayout=createLayout(mColumnWidth、mText、mPaint);
int=0;
int usedWidth=0;
while(usedWidth
否,如果第一列已完成,我只想在第二列中添加。虽然此链接可以回答问题,但最好在此处包含答案的基本部分,并提供链接以供参考。如果链接页面发生更改,则仅链接答案可能无效您完全正确!编辑答案,以包含基本部分。
protected void onDraw(Canvas canvas) {
    if(mTextLayoutNeeded) {
        createLayouts(getWidth(), getHeight());
    }
    super.onDraw(canvas);
    canvas.save();
    canvas.translate(getPaddingLeft(), getPaddingTop());
    for(Layout l : layouts) {
        l.draw(canvas);
        canvas.translate(mColumnWidth, 0);
        canvas.translate(mSpacing, 0);
    }
    canvas.restore();
}

private void createLayouts(int width, int height) {
    layouts.clear();
    if(mText == null) {
        return;
    }
    int availableWidth = getWidth() - getPaddingLeft() - getPaddingRight();
    int availableHeight = getHeight() - getPaddingTop() - getPaddingBottom();
    Layout masterLayout = createLayout(mColumnWidth, mText, mPaint);
    int startLine = 0;
    int usedWidth = 0;
    while(usedWidth < availableWidth - mSpacing - mColumnWidth) {
        int startLineTop = masterLayout.getLineTop(startLine);
        int endLine = startLine;
        for(int i = startLine; i < masterLayout.getLineCount(); i++) {
            if(masterLayout.getLineBottom(i) - startLineTop < availableHeight) {
                endLine = i;
            } else if(endLine == startLine) {
                //A large image can be larger than the available height, skip the content
                Toast.makeText(getContext(), "Skipping too large content", Toast.LENGTH_SHORT).show();
                startLine++;
                startLineTop = masterLayout.getLineTop(startLine);
                endLine = startLine;
            } else {
                break;
            }
        }
        int columnStart = masterLayout.getLineStart(startLine);
        int columnEnd = masterLayout.getLineEnd(endLine);
        layouts.add(createLayout(mColumnWidth, mText, columnStart, columnEnd, mPaint));
        if(endLine == masterLayout.getLineCount() - 1) {
            break;
        }
        usedWidth += mColumnWidth;
        startLine = endLine;
    }
    mTextLayoutNeeded = false;
}

private static Layout createLayout(int width, CharSequence text, TextPaint paint) {
    return new StaticLayout(text, 0, text.length(), paint,
            width, Layout.Alignment.ALIGN_NORMAL, 1f, 0, true);
}

private static Layout createLayout(int width, CharSequence text, int offset, int end, TextPaint paint) {
    return new StaticLayout(text, offset, end, paint,
            width, Layout.Alignment.ALIGN_NORMAL, 1f, 0, true);
}