java - tachar - Android: ¿Cómo se subrayan todas las líneas en un texto de edición?
tachar texto android studio (3)
Como es visible desde su código, está dibujando un underline
para el edit text
para que las líneas de 0 to count
en su ciclo for y el count
se configure como int count = getLineCount();
. ¡De modo que solo se incrementará el número existente de líneas en EditText! ¡Al cambiar el número de conteo, puede dibujar tantos subrayados como desee!
Desde el tutorial he creado el diseño:
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"
/>
Esto hace que solo la primera línea esté subrayada. ¿Es posible hacer que todas las líneas estén subrayadas, incluso si solo hay una línea en el texto edtit?
Intenté cambiar el ciclo, por ejemplo, for (int i = 0; i < 5; i++)
pero luego recibí este error:
04-28 08: 29: 05.093: E / AndroidRuntime (14398): java.lang.IndexOutOfBoundsException: 2, 1 04-28 08: 29: 05.093: E / AndroidRuntime (14398): en android.text.PackedIntVector.getValue ( PackedIntVector.java:70) 04-28 08: 29: 05.093: E / AndroidRuntime (14398): en android.text.DynamicLayout.getLineTop (DynamicLayout.java:367) 04-28 08: 29: 05.093: E / AndroidRuntime ( 14398): en android.text.Layout.getLineBottom (Layout.java:831) 04-28 08: 29: 05.093: E / AndroidRuntime (14398): en android.text.Layout.getLineBounds (Layout.java:437) 04 -28 08: 29: 05.093: E / AndroidRuntime (14398): en android.widget.TextView.getLineBounds (TextView.java:4122) 04-28 08: 29: 05.093: E / AndroidRuntime (14398): en com.bbbfr .mynotepad.NotepadText $ LinedEditText.onDraw (NotepadText.java:56)
a esta línea: int baseline = getLineBounds(i, r);
También he configurado android:lines="5"
en la vista.
La solución más simple es que puede invocar setText solo con separadores de línea en el constructor, por ejemplo, "/ n / n / n" (Puede crearlo de forma dinámica según la cantidad de líneas que necesite), entonces su LinedEditText actual tendrá los subrayados como usted quiere.
Si no le molesta que el subrayado tenga el mismo color que el texto en EditText
, realmente debería usar el UnderlineSpan
incorporado, ya sea creándolo usted mismo o indirectamente a través de 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));
}
La principal diferencia con su enfoque actual es que esto solo subrayará el texto real, y no toda la línea de texto. Por ejemplo, si ejecuta mi fragmento de código, verá que el subrayado no se extiende hasta el final de la línea cuando se interrumpe con /n
o <br/>
. Sin embargo, dependiendo del comportamiento posterior, esto puede no ser lo que estás buscando.
Editar: Entonces, si te entiendo correctamente, básicamente quieres seguir dibujando líneas horizontales en tu EditText
, sin importar si hay texto o no. La parte ''subrayado'' en su pregunta fue un poco engañosa, ya que resulta que tiene poco que ver con eso (en el sentido tradicional de la palabra :)).
De todos modos, no puede usar getLineCount()
ya que siempre devolverá el número de líneas que contienen texto real. Eso significaría que tendrías que ''rellenar'' cualquier espacio restante con nuevos personajes de línea para obtener el efecto deseado, lo que suena bastante asqueroso ... Probablemente, una mejor alternativa sea basar el trazado de líneas horizontales en la altura total de EditText
. Un ejemplo rápido, que obviamente puede ajustar a su gusto:
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);
}
}
El resultado es así: