4

チュートリアルから、レイアウトを作成しました:

  public static class LinedEditText extends EditText {
        private Rect mRect;
        private Paint mPaint;

        // we need this constructor for LayoutInflater
        public LinedEditText(Context context, AttributeSet attrs) {
            super(context, attrs);

            mRect = new Rect();
            mPaint = new Paint();
            mPaint.setStyle(Paint.Style.STROKE);
            mPaint.setColor(0x80000000);
        }

        @Override
        protected void onDraw(Canvas canvas) {
            int count = getLineCount();
            Rect r = mRect;
            Paint paint = mPaint;

            for (int i = 0; i < count; i++) {
                int baseline = getLineBounds(i, r);
                canvas.drawLine(r.left, baseline + 1, r.right, baseline + 1, paint);
            }

            super.onDraw(canvas);
        }
    }

<view xmlns:android="http://schemas.android.com/apk/res/android"
    class="com.bbbfr.mynotepad.NotepadText$LinedEditText"
    android:id="@+id/note"
    android:background="#ffd6e5"
    android:layout_width="fill_parent"
    android:layout_height="fill_parent"
    android:padding="5dp"
    android:scrollbars="vertical"
    android:fadingEdge="vertical"
    android:gravity="top"
    android:textSize="22sp"
    android:textColor="#000000"
    android:inputType="textMultiLine"
    android:capitalize="sentences"
/>

これにより、最初の行だけに下線が引かれます。編集テキストが1行しかない場合でも、すべての行に下線を引くことはできますか?

たとえば、ループを変更しようとしました for (int i = 0; i < 5; i++)が、次のエラーが表示されます。

04-28 08:29:05.093: E/AndroidRuntime(14398): java.lang.IndexOutOfBoundsException: 2, 1 04-28 08:29:05.093: E/AndroidRuntime(14398): android.text.PackedIntVector.getValue( PackedIntVector.java:70) 04-28 08:29:05.093: E/AndroidRuntime(14398): android.text.DynamicLayout.getLineTop(DynamicLayout.java:367) 04-28 08:29:05.093: E/AndroidRuntime( 14398): android.text.Layout.getLineBottom(Layout.java:831) 04-28 08:29:05.093: E/AndroidRuntime(14398): android.text.Layout.getLineBounds(Layout.java:437) 04 -28 08:29:05.093: E/AndroidRuntime(14398): android.widget.TextView.getLineBounds(TextView.java:4122) 04-28 08:29:05.093: E/AndroidRuntime(14398): com.bbbfr .mynotepad.NotepadText$LinedEditText.onDraw(NotepadText.java:56)

この行に:int baseline = getLineBounds(i, r);

ビューにも設定android:lines="5"しました。

4

3 に答える 3

11

下線が のテキストと同じ色であっても構わない場合はEditText、組み込みの を使用する必要がありUnderlineSpanますHtml.fromHtml(...)

private void createUnderlinedText() {
    String text = "I am underlined text\nLine #2\nLine #3\nLine #4\nLine #5";

    EditText underlineSpanEditText = (EditText) findViewById(R.id.underlinespan_edittext);
    SpannableStringBuilder sb = new SpannableStringBuilder(text);
    sb.setSpan(new UnderlineSpan(), 0, text.length(), Spannable.SPAN_EXCLUSIVE_EXCLUSIVE);
    underlineSpanEditText.setText(sb);

    EditText htmlUnderlineEditText = (EditText) findViewById(R.id.html_underline_edittext);
    String html = "<u>I am underlined text</br>Line #2</br>Line #3</br>Line #4</br>Line #5</u>";
    htmlUnderlineEditText.setText(Html.fromHtml(html));
}

現在のアプローチとの主な違いは、テキスト行全体ではなく、実際のテキストのみに下線が引かれることです。\nたとえば、私のコード スニペットを実行すると、下線がまたはで区切られている場合、下線が行末まで伸びていないことがわかります<br/>。ただし、その後の動作によっては、これが探しているものではない場合があります。


編集:私があなたを正しく理解していれば、EditTextテキストがあるかどうかに関係なく、基本的に水平線を描画し続けたいですか?あなたの質問の「下線」の部分は、誤解を招くようなものでした。結局のところ、それはそれとはほとんど関係がないからです(単語の伝統的な意味で:))。

getLineCount()とにかく、実際のテキストを含む行数を常に返すため、使用できません。つまり、目的の効果を得るには、残りのスペースを改行文字で「埋める」必要があるということですEditText。明らかに自分の好みに合わせて微調整できる簡単な例:

public class LinedEditText extends EditText {
    private Paint mPaint = new Paint();

    public LinedEditText(Context context) {
        super(context);
        initPaint();
    }

    public LinedEditText(Context context, AttributeSet attrs) {
        super(context, attrs);
        initPaint();
    }

    public LinedEditText(Context context, AttributeSet attrs, int defStyle) {
        super(context, attrs, defStyle);
        initPaint();
    }

    private void initPaint() {
        mPaint.setStyle(Paint.Style.STROKE);
        mPaint.setColor(0x80000000);
    }

    @Override protected void onDraw(Canvas canvas) {
        int left = getLeft();
        int right = getRight();
        int paddingTop = getPaddingTop();
        int paddingBottom = getPaddingBottom();
        int paddingLeft = getPaddingLeft();
        int paddingRight = getPaddingRight();
        int height = getHeight();
        int lineHeight = getLineHeight();
        int count = (height-paddingTop-paddingBottom) / lineHeight;

        for (int i = 0; i < count; i++) {
            int baseline = lineHeight * (i+1) + paddingTop;
            canvas.drawLine(left+paddingLeft, baseline, right-paddingRight, baseline, mPaint);
        }

        super.onDraw(canvas);
    }
}

結果は次のようになります。

LinedEditText

于 2012-04-28T09:02:59.310 に答える
0

コードからわかるように、forループ内からfor行を描画underlineしており、に設定されています。したがって、EditTextの既存の行数のみが増分されます。カウント数を変更することで、好きなだけ下線を引くことができます!edit text0 to countcountint count = getLineCount();

于 2012-04-28T08:13:22.247 に答える
0

最も簡単な回避策は、コンストラクターで行区切りのみを使用して setText を呼び出すことです。たとえば、「\n\n\n」(必要な行数に基づいて動的に構築できます)、現在の LinedEditText にはあなたがしたい。

于 2012-04-28T09:09:30.230 に答える