Cómo agregar pagelines a un EditText en android?
¿Es posible mostrar pagelines en un EditText
?
Me refiero a estas líneas:
- ¿Cómo mostrar el temporizador de cuenta regresiva en la barra de estado en android, como la pantalla de tiempo?
- ¿Qué carpetas de diseño son necesarias para admitir todos los dispositivos Android?
- Pantalla débil e interacción de bloques con hojas de fondo
- Cómo mostrar y ocultar ActionBar con AppCompat v.7
- Android 2-Way DataBinding con vista personalizada y Attr personalizado
Digamos que mi EditText
es de 500 por 500 píxeles de tamaño. Quiero que esas líneas sean visibles a través de ese 500 por 500 cuadrados.
¿Hay una forma de construir esto? Ya intenté Google pero no pude encontrar una respuesta. Supongo que mi otra opción es crear dinámicamente un gráfico basado en textheight y linespacing, un trabajo feo.
- No puedo ver mi aplicación en la lista de aplicaciones Android recientemente abiertas.
- Android setAlpha en imageView en CollapsingToolbarLayout no funciona
- Android ViewPager Cargando fragmentos incorrectos
- ¿Cómo centrar el contenido dentro de un diseño lineal?
- Creación de accesos directos en Android mediante Intent
- Android ImageButton sin borde, pero sigue con la indicación de clic
- Utilizar XML Layout como vista para Subclase de vista?
- Fragment.onCreateView tiene un contenedor nulo
La muestra de aplicación de bloc de notas del sitio de desarrollo de Android muestra cómo hacer esto.
http://developer.android.com/resources/samples/NotePad/index.html
Parece esto (desplácese hacia abajo para el código):
La mayor parte del código relevante está en este archivo . Preste atención a la clase interna LinedEditText
. Se define dentro de la actividad. Dibuja las líneas requeridas.
Dentro del método onCreate()
la actividad, setContentView(R.id.note_editor)
se establece como la vista, se define como aquí
Snippet extraído de aquí . Actualización : Código modificado por @ Pieter888 para dibujar líneas en todo el control EditText
.
import android.content.Context; import android.graphics.Canvas; import android.graphics.Paint; import android.graphics.Rect; import android.util.AttributeSet; import android.widget.EditText; public class LinedEditText extends EditText { private Rect mRect; private Paint mPaint; public LinedEditText(Context context, AttributeSet attrs) { super(context, attrs); mRect = new Rect(); mPaint = new Paint(); mPaint.setStyle(Paint.Style.STROKE); mPaint.setColor(0xFF000000); } /** * This is called to draw the LinedEditText object * @param canvas The canvas on which the background is drawn. */ @Override protected void onDraw(Canvas canvas) { int height = canvas.getHeight(); int curHeight = 0; Rect r = mRect; Paint paint = mPaint; int baseline = getLineBounds(0, r); for (curHeight = baseline + 1; curHeight < height; curHeight += getLineHeight()) { canvas.drawLine(r.left, curHeight, r.right, curHeight, paint); } super.onDraw(canvas); } }
La respuesta de @ gideon arriba funciona bien pero tiene un problema cuando se introduce más texto en el edittext
porque más líneas no se dibujan en consecuencia. Para solucionar esto, escribí un override para onMeasure()
y llamado invalidate()
. y se dibujarán más líneas cuando el texto aumente.
@Override protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) { super.onMeasure(widthMeasureSpec,heightMeasureSpec); invalidate(); }
El código ahora es:
import android.content.Context; import android.graphics.Canvas; import android.graphics.Paint; import android.graphics.Rect; import android.util.AttributeSet; import android.widget.EditText; public class LinedEditText extends EditText { private Rect mRect; private Paint mPaint; public LinedEditText(Context context, AttributeSet attrs) { super(context, attrs); mRect = new Rect(); mPaint = new Paint(); mPaint.setStyle(Paint.Style.STROKE); mPaint.setColor(0xFF000000); } /** * This is called to draw the LinedEditText object * @param canvas The canvas on which the background is drawn. */ @Override protected void onDraw(Canvas canvas) { int height = canvas.getHeight(); int curHeight = 0; Rect r = mRect; Paint paint = mPaint; int baseline = getLineBounds(0, r); for (curHeight = baseline + 1; curHeight < height; curHeight += getLineHeight()) { canvas.drawLine(r.left, curHeight, r.right, curHeight, paint); } super.onDraw(canvas); } @Override protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) { super.onMeasure(widthMeasureSpec,heightMeasureSpec); invalidate(); } }
- La forma más rápida de buscar a través de cadenas almacenadas en la base de datos sqlite
- ¿Cómo evito esta espera ocupada?