我创建了两个布局垂直宽度相等。我有字符串数据动态显示在文本视图上。当字符串大于布局的宽度时,字符串将被包装到布局的宽度,对于剩余的字符串,我想动态创建新的电视。此过程结束,直到剩余的字符串结束。对于下一个字符串相同的过程继当进程到达linearlayout1的底部时,剩余的字符串应该从linearlayout2开始。并且该过程一直持续到它到达linearlayout2的底部。
我试过这个
private void nextlinechar(int numChars,String devstr) {
nextchar=devstr;
Log.d("char 1",""+nextchar);
TextView sub=new TextView(getApplicationContext());
sub.setLines(1);
sub.setTextColor(Color.BLACK);
sub.setTextSize(textsize);
sub.setText(nextchar);
nextchar=devstr.substring(nextcharstart);
String textToBeSplit = nextchar; // Text you want to split between TextViews
String data=TextMeasure(nextchar,sub);
float myTextSize=sub.getTextSize();
float textView2Width=400;
// String next=TextMeasure(nextchar,sub);
Paint paint = new Paint();
paint.setTextSize(myTextSize); // Your text size
numChars1= paint.breakText(textToBeSplit, true,textView2Width, null);
nextchar1=nextchar.substring(numChars1);
// Log.d("char",""+i+" "+nextchar.length());
main.addView(sub);
nextlinechar(numChars1,nextchar);
}
插图
答案 0 :(得分:1)
可能的解决方案1
您需要的是FlowLayout,找到here。基本上文本需要环绕,而不是向右溢出。
可能的解决方案2
尝试使用网页浏览,并在2个网页浏览中填充文字。使用较少的代码而不是错误的情况会更快。
我只在需要单独点击每个单词时才使用FlowLayout。基本上是语法测试,人们选择句子的词性。为此,我需要听取每个单词。
答案 1 :(得分:0)
Reffer这可能对您有所帮助:
package com.example.demo;
import android.content.Context;
import android.graphics.Paint;
import android.util.AttributeSet;
import android.util.TypedValue;
import android.widget.TextView;
public class FontFitTextView extends TextView {
public FontFitTextView(Context context) {
super(context);
initialise();
}
public FontFitTextView(Context context, AttributeSet attrs) {
super(context, attrs);
initialise();
}
private void initialise() {
mTestPaint = new Paint();
mTestPaint.set(this.getPaint());
// max size defaults to the initially specified text size unless it is
// too small
}
/*
* Re size the font so the specified text fits in the text box assuming the
* text box is the specified width.
*/
private void refitText(String text, int textWidth) {
if (textWidth <= 0)
return;
int targetWidth = textWidth - this.getPaddingLeft()
- this.getPaddingRight();
float hi = 100;
float lo = 2;
final float threshold = 0.5f; // How close we have to be
mTestPaint.set(this.getPaint());
while ((hi - lo) > threshold) {
float size = (hi + lo) / 2;
mTestPaint.setTextSize(size);
if (mTestPaint.measureText(text) >= targetWidth)
hi = size; // too big
else
lo = size; // too small
}
// Use lo so that we undershoot rather than overshoot
this.setTextSize(TypedValue.COMPLEX_UNIT_PX, lo);
}
@Override
protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
super.onMeasure(widthMeasureSpec, heightMeasureSpec);
int parentWidth = MeasureSpec.getSize(widthMeasureSpec);
int height = getMeasuredHeight();
refitText(this.getText().toString(), parentWidth);
this.setMeasuredDimension(parentWidth, height);
}
@Override
protected void onTextChanged(final CharSequence text, final int start,
final int before, final int after) {
refitText(text.toString(), this.getWidth());
}
@Override
protected void onSizeChanged(int w, int h, int oldw, int oldh) {
if (w != oldw) {
refitText(this.getText().toString(), w);
}
}
// Attributes
private Paint mTestPaint;
}
答案 2 :(得分:0)
以下是我想出的一个想法(当然我首先尝试搜索TextViwe的内置方法,它可以满足您的需求,但找不到任何内容):
根据屏幕大小(this.getResources()。getDefaultDisplay()然后搜索正确的方法)确定每个布局(左侧和右侧)应显示的行数,所需的文本尺寸和布局之间以及文本和顶部/底部边缘之间的间距。不要忘记您可能需要将像素转换为倾角,反之亦然,因为大多数Android尺寸测量方法都会以像素为单位返回大小。
设置每台电视的最大线路数(tv.setLines())。
将整个文字设置为左侧电视。
现在文本的前半部分将显示在左侧电视中。文本的另一部分将被隐藏,因为您已达到电视中的最大行数。因此,使用getText()来接收当前显示在电视中的文本(希望,这将只返回文本的前半部分..尚未尝试过,抱歉。如果没有,也许有一些getDisplayedText()方法或者其他的东西)。现在,您可以使用简单的Java方法从原始文本(子字符串)中仅检索文本的提醒部分,并将其设置为第二个电视。
希望有所帮助。