[英]Multi-Column Text Displays in Android
我想在2列中顯示文本。
例如 我有大String,在第一列中添加第一個字符串,並在屏幕高度結束后,在第二列中添加文本。 像新聞紙一樣。
我嘗試下面的代碼,但它給了我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文件
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="horizontal"
android:weightSum="2"
tools:context=".MainActivity" >
<TextView
android:id="@+id/textl"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:layout_weight="1"
android:text="@string/hello_world" />
<TextView
android:id="@+id/textr"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:layout_weight="1"
android:text="@string/hello_world" />
</LinearLayout>
我剛剛創建了一個示例項目,該項目將文本呈現到多個列: https : //github.com/viht0ri/ColumnLayout
這種方法使用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);
}
在嘗試從文本獲取子字符串之前,請確保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中。
這會起作用。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.