8

縦方向に同じ幅の2 つのレイアウトを作成しました。そして、テキストビューに動的に表示される文字列データがあります。文字列がレイアウトの幅よりも大きい場合、文字列はレイアウトの幅にラップされ、残りの文字列については新しい TV を動的に作成したいと考えています。このプロセスは、残りの文字列が終了するまで終了します。次の文字列については、同じプロセスが続きます。プロセスが 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

代わりに Web ビューを使用して、2 つの Web ビューにテキストを入力してみてください。コードが少ないほど高速になり、バグも少なくなります。

各単語を個別にクリックする必要がある場合にのみ FlowLayout を使用しました。基本的に、人々が文の品詞を選択する文法のテストです。そのためには、各単語のリスナーが必要でした。

于 2013-06-20T03:43:13.127 に答える
0

以下は私が思いついたアイデアです (もちろん、最初に、必要なことを実行する TextViwe の組み込みメソッドを検索しようとしましたが、何も見つかりませんでした):

  1. 画面サイズ (this.getResources().getDefaultDisplay() を選択し、適切なメソッドを検索)、目的のテキスト サイズ、およびレイアウト間のスペースに応じて、各レイアウト (左右) に表示する行数を決定します。レイアウトとテキストと上端/下端の間。ほとんどの Android サイズ測定メソッドはサイズをピクセル単位で返すため、ピクセルをディップに、またはその逆に変換する必要がある場合があることを忘れないでください。

  2. 各 TV に最大回線数を設定します (tv.setLines())。

  3. テキスト全体を左側のテレビに設定します。

  4. これで、テキストの前半が左側の TV に表示されます。TV の最大行数に達したため、テキストの他の部分は非表示になります。そのため、getText() を使用して、TV に現在表示されているテキストを受け取ります (できれば、これはテキストの前半のみを返します。まだ試していません。申し訳ありません。そうでない場合は、getDisplayedText() メソッドがあるかもしれません)か何か)。これで、単純な Java メソッドを使用して、元のテキスト (部分文字列) からテキストの残りの部分のみを取得し、それを 2 番目の TV に設定できます。

それが役立つことを願っています。

于 2013-06-22T07:43:05.810 に答える
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 に答える