8

我创建了两个宽度相等的垂直布局。而且我有要在文本视图上动态显示的字符串数据。当字符串大于布局的宽度时,字符串被包装到布局的宽度,对于剩余的字符串,我想动态创建一个新的电视。此过程结束,直到剩余的字符串完成。对于下一个字符串,相同的过程继续。当进程到达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);
}

插图

在此处输入图像描述

4

3 回答 3

1

可能的解决方案 1

您需要的是 FlowLayout,可在此处找到。基本上文本需要环绕,而不是向右溢出。

可能的解决方案 2

尝试改用 webview,并在 2 个 webview 中填充文本。使用更少的代码会更快,而不是错误。

仅当我需要分别单击每个单词时才使用 FlowLayout。基本上是一种语法测试,人们选择句子的词性。为此,我需要每个单词的听众。

于 2013-06-20T03:43:13.127 回答
0

参考这可能对您有帮助:

 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;
    }
于 2013-06-19T04:52:42.093 回答
0

以下是我想出的一个想法(当然我首先尝试搜索 TextViwe 的内置方法,它可以满足您的需求,但找不到):

  1. 根据屏幕大小(this.getResources().getDefaultDisplay() 然后搜索正确的方法)、所需的文本大小和布局和文本和顶部/底部边缘之间。不要忘记您可能需要将像素转换为下降,反之亦然,因为大多数 Android 尺寸测量方法都会返回以像素为单位的尺寸。

  2. 设置每个电视的最大行数 (tv.setLines())。

  3. 将整个文本设置为左侧电视。

  4. 现在文本的前半部分将显示在左侧电视中。文本的另一部分将被隐藏,因为您已达到电视中的最大行数。因此,使用 getText() 接收当前显示在电视中的文本(希望这将只返回文本的前半部分。。还没有尝试过,抱歉。如果没有,也许有一些 getDisplayedText() 方法或者其他的东西)。现在,您可以使用简单的 Java 方法从原始文本(子字符串)中仅检索文本的剩余部分并将其设置为第二台电视。

希望有帮助。

于 2013-06-22T07:43:05.810 回答