問題描述
從教程中我創建了布局:
From the tutorial I have created the layout:
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"
/>
這只會使第一行加下劃線.即使編輯文本中只有一行,是否可以將所有行都加下劃線?
This makes only the first line underlined. Is it possible to make all the lines underlined, even if there is only one line in the edtittext?
我嘗試改變循環,例如for (int i = 0; i < 5; i++)
但隨后我收到此錯誤:
I tried changing the loop e.g. for (int i = 0; i < 5; i++)
but then I receive this error:
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-2808:29:05.093: E/AndroidRuntime(14398): 在android.text.DynamicLayout.getLineTop(DynamicLayout.java:367) 04-2808: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-2808:29:05.093: E/AndroidRuntime(14398): 在com.bbbfr.mynotepad.NotepadText$LinedEditText.onDraw(NotepadText.java:56)
04-28 08:29:05.093: E/AndroidRuntime(14398): java.lang.IndexOutOfBoundsException: 2, 1 04-28 08:29:05.093: E/AndroidRuntime(14398): at android.text.PackedIntVector.getValue(PackedIntVector.java:70) 04-28 08:29:05.093: E/AndroidRuntime(14398): at android.text.DynamicLayout.getLineTop(DynamicLayout.java:367) 04-28 08:29:05.093: E/AndroidRuntime(14398): at android.text.Layout.getLineBottom(Layout.java:831) 04-28 08:29:05.093: E/AndroidRuntime(14398): at android.text.Layout.getLineBounds(Layout.java:437) 04-28 08:29:05.093: E/AndroidRuntime(14398): at android.widget.TextView.getLineBounds(TextView.java:4122) 04-28 08:29:05.093: E/AndroidRuntime(14398): at com.bbbfr.mynotepad.NotepadText$LinedEditText.onDraw(NotepadText.java:56)
到這一行:int baseline = getLineBounds(i, r);
我還在視圖中設置了 android:lines="5"
.
I have also set android:lines="5"
in the view.
推薦答案
如果你不介意下劃線與 EditText
中的文本顏色相同,你真的應該只是使用內置 UnderlineSpan
,可以自己創建,也可以通過 Html.fromHtml(...)
間接創建.
If you don't mind the underline having the same colour as the text in the EditText
, you should really just use the built-in UnderlineSpan
, either by creating it yourself or indirectly through Html.fromHtml(...)
.
private void createUnderlinedText() {
String text = "I am underlined text
Line #2
Line #3
Line #4
Line #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));
}
與您當前方法的主要區別在于,這只會在實際文本下劃線,而不是整個文本行.例如,如果您運行我的代碼片段,您會發現下劃線在被
或 <br/> 斷開時并沒有延伸到行尾.代碼>.但是,根據您之后的行為,這可能不是您想要的.
The main difference with your current approach is that this will only underline the actual text, and not the whole text line. For example, if you run my code snippet, you will find that the underline does not extend to the end of the line when it's broken off by the
or <br/>
. However, depending on the behaviour your after, this may not be what you're looking for.
所以如果我理解正確的話,你基本上想在你的EditText
中繼續畫水平線,不管有沒有文字?您問題中的下劃線"部分有點誤導,因為事實證明,這與它幾乎沒有關系(在這個詞的傳統含義中:)).
So if I understand you correctly, you basically want to keep drawing horizontal lines in your EditText
, no matter wether there is text or not? The 'underline' part in your question was kind of misleading, since, as it turns out, that has little to do with it (in the traditional meaning of the word :)).
無論如何,您不能使用 getLineCount()
因為它總是會返回包含實際文本的行數.這意味著您必須用換行符填充"任何剩余空間才能獲得所需的效果,這聽起來有點惡心......更好的選擇可能是將水平線的繪制基于 <的總高度代碼>編輯文本代碼>.一個簡單的示例,您顯然可以根據自己的喜好對其進行調整:
Anyways, you can't use getLineCount()
since that will always return the number of lines that contain actual text. That would mean you would have to 'fill' any remaing space with new line characters to get the desired effect, which sounds kind of yucky... A better alternative is probably to base the drawing of horizontal lines on the total height of the EditText
. A quick example, which you can obviously tweak to your own liking:
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);
}
}
結果如下:
這篇關于Android - 如何使edittext中的所有行都加下劃線?的文章就介紹到這了,希望我們推薦的答案對大家有所幫助,也希望大家多多支持html5模板網!