programacion - manual android studio avanzado
Android: TextView: elimina el espaciado y el relleno en la parte superior e inferior (12)
Busqué mucho para obtener la respuesta adecuada, pero no encontré una respuesta que pudiera eliminar exactamente todo el relleno de TextView
, pero finalmente, después de TextView
el documento oficial, pude resolver los textos de una sola línea.
android:includeFontPadding="false"
android:lineSpacingExtra="0dp"
Agregar estas dos líneas a TextView
xml hará el trabajo.
El primer atributo elimina el relleno reservado para los acentos y el segundo atributo elimina el espacio reservado para mantener el espacio adecuado entre dos líneas de texto.
Asegúrese de no agregar
lineSpacingExtra="0dp"
en TextView multilínea, ya que podría parecer torpe
Cuando tengo un TextView
con /n
en el texto ,, a la derecha tengo dos singleLine
TextView
s, uno debajo del otro sin espacio entre ellos. He configurado lo siguiente para los tres TextView
s.
android:lineSpacingMultiplier="1" android:lineSpacingExtra="0pt" android:paddingTop="0pt" android:paddingBottom="0pt"
La primera línea de la izquierda TextView
alinea perfectamente con la parte superior derecha TextView
. La segunda línea del TextView
izquierdo es un poco más alta que la segunda línea de la parte inferior derecha de TextView
.
Parece que hay algún tipo de relleno oculto en la parte superior e inferior de los TextView
. ¿Cómo puedo eliminar eso?
Creo que este problema se puede resolver de esta manera:
<TextView
android:id="@+id/leftText"
android:includeFontPadding="false"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:textSize="30dp"
android:text="Hello World!/nhello world" />
<TextView
android:id="@+id/rightUpperText"
android:includeFontPadding="false"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_toRightOf="@+id/leftText"
android:layout_alignTop="@+id/leftText"
android:textSize="30dp"
android:text="Hello World!" />
<TextView
android:id="@+id/rightLowerText"
android:includeFontPadding="false"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_toRightOf="@+id/leftText"
android:layout_below="@+id/rightUpperText"
android:textSize="30dp"
android:text="hello world" />
Esos son los resultados:
Aunque la línea de caracteres especiales en rightLowerText parece un poco más alta que la segunda línea de leftText, sus líneas de base se mantienen alineadas.
Dado que mi requisito es anular el textView existente obtener de findViewById(getResources().getIdentifier("xxx", "id", "android"));
, así que no puedo simplemente probar onDraw()
de otra respuesta.
Pero solo averiguo los pasos correctos para solucionar mi problema, aquí está el resultado final de Layout Inspector:
Como lo que quería era simplemente eliminar los espacios superiores, así que no tenía que elegir otra fuente para eliminar los espacios inferiores.
Aquí está el código crítico para arreglarlo:
Typeface mfont = Typeface.createFromAsset(getResources().getAssets(), "fonts/myCustomFont.otf");
myTextView.setTypeface(mfont);
myTextView.setPadding(0, 0, 0, 0);
myTextView.setIncludeFontPadding(false);
La primera clave es establecer la fuente personalizada "fonts / myCustomFont.otf" que tiene el espacio en la parte inferior pero no en la parte superior, puedes averiguarlo fácilmente al abrir el archivo otf y hacer clic en cualquier fuente en Android Studio:
Como puede ver, el cursor en la parte inferior tiene espaciado adicional pero no en la parte superior, por lo que solucionó mi problema.
La segunda clave es que no se puede omitir el código , de lo contrario podría no funcionar. Esa es la razón por la que puede encontrar que algunas personas comentan que una respuesta funciona y otras personas comentan que no está funcionando.
Vamos a ilustrar lo que sucederá si elimino uno de ellos.
Sin setTypeface(mfont);
:
Sin setPadding(0, 0, 0, 0);
:
Sin setIncludeFontPadding(false);
:
Sin 3 de ellos (es decir, el original):
Elimino el espacio en mi vista personalizada - NoPaddingTextView.
https://github.com/SenhLinsh/NoPaddingTextView
package com.linsh.nopaddingtextview;
import android.content.Context;
import android.graphics.Canvas;
import android.util.AttributeSet;
import android.util.Log;
import android.util.TypedValue;
import android.widget.TextView;
/**
* Created by Senh Linsh on 17/3/27.
*/
public class NoPaddingTextView extends TextView {
private int mAdditionalPadding;
public NoPaddingTextView(Context context) {
super(context);
init();
}
public NoPaddingTextView(Context context, AttributeSet attrs) {
super(context, attrs);
init();
}
private void init() {
setIncludeFontPadding(false);
}
@Override
protected void onDraw(Canvas canvas) {
int yOff = -mAdditionalPadding / 6;
canvas.translate(0, yOff);
super.onDraw(canvas);
}
@Override
protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
getAdditionalPadding();
int mode = MeasureSpec.getMode(heightMeasureSpec);
if (mode != MeasureSpec.EXACTLY) {
int measureHeight = measureHeight(getText().toString(), widthMeasureSpec);
int height = measureHeight - mAdditionalPadding;
height += getPaddingTop() + getPaddingBottom();
heightMeasureSpec = MeasureSpec.makeMeasureSpec(height, MeasureSpec.EXACTLY);
}
super.onMeasure(widthMeasureSpec, heightMeasureSpec);
}
private int measureHeight(String text, int widthMeasureSpec) {
float textSize = getTextSize();
TextView textView = new TextView(getContext());
textView.setTextSize(TypedValue.COMPLEX_UNIT_PX, textSize);
textView.setText(text);
textView.measure(widthMeasureSpec, 0);
return textView.getMeasuredHeight();
}
private int getAdditionalPadding() {
float textSize = getTextSize();
TextView textView = new TextView(getContext());
textView.setTextSize(TypedValue.COMPLEX_UNIT_PX, textSize);
textView.setLines(1);
textView.measure(0, 0);
int measuredHeight = textView.getMeasuredHeight();
if (measuredHeight - textSize > 0) {
mAdditionalPadding = (int) (measuredHeight - textSize);
Log.v("NoPaddingTextView", "onMeasure: height=" + measuredHeight + " textSize=" + textSize + " mAdditionalPadding=" + mAdditionalPadding);
}
return mAdditionalPadding;
}
}
Es posible que desee intentar alinear la parte inferior de la vista de texto izquierda con la parte inferior de la segunda vista de texto derecha.
Esto también me molestó, y la respuesta que encontré fue que en realidad hay espacio adicional en la fuente en sí, no en TextView. Es bastante irritante, viniendo de un fondo de publicación de documentos, la cantidad limitada de control que tiene con Android sobre los elementos tipográficos. Recomiendo usar una tipografía personalizada (como Bitstream Vera Sans, que tiene licencia para redistribución) que puede no tener este problema. Sin embargo, no estoy seguro específicamente si lo hace o no.
Mira esto:
Alinee ImageView con EditText horizontalmente
Parece que la imagen de fondo de EditText tiene algunos píxeles transparentes que también agregan relleno.
Una solución es cambiar el fondo predeterminado de EditText a otra cosa (o nada, pero no hay antecedentes para EditText probablemente no sea aceptable). Eso se puede hacer configurando Android: atributo XML de fondo.
android:background="@drawable/myEditBackground"
Que yo sepa, esto es inherente a la mayoría de los widgets y la cantidad de "relleno" difiere entre los fabricantes de teléfonos. Este relleno es realmente un espacio en blanco entre el borde de la imagen y la imagen en el archivo de imagen de 9 parches.
Por ejemplo, en mi Droid X, los widgets giratorios tienen más espacio en blanco que los botones, lo que hace que parezca incómodo cuando tienes un girador en línea con un botón, ¡pero en el teléfono de mi esposa la misma aplicación no tiene el mismo problema y se ve genial!
La única sugerencia que tengo es crear tus propios 9 archivos de parches y usarlos en tu aplicación.
Ahhh los dolores que son Android.
Editado: Aclare el relleno contra el espacio en blanco.
Siento tu dolor. He intentado todas las respuestas anteriores, incluido el setIncludeFontPadding
en falso, que no hizo nada por mí.
¿Mi solución? layout_marginBottom="-3dp"
en el TextView
le da una solución para el fondo, ¡BAM!
Aunque, -3dp en layout_marginTop
falla .... ugh.
Simplemente usa
android:padding="0dp"
<RelativeLayout
android:layout_width="match_parent"
android:layout_height="match_parent">
<TextView
android:id="@+id/textView"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_alignBaseline="@+id/baselineImage"
android:includeFontPadding="false" />
<ImageView
android:id="@+id/baselineImage"
android:layout_width="1dp"
android:layout_height="1dp"
android:baselineAlignBottom="true"
android:layout_alignParentBottom="true" />
<!-- This view will be exactly 10dp below the baseline of textView -->
<View
android:id="@+id/view"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginTop="10dp"
android:layout_below="@+id/baselineImage" />
</RelativeLayout>
Con un ImageView adicional, podemos configurar el TextView para alinearlo con el ImageView y establecer el android:baselineAlignBottom
en el ImageView en true, lo que hará que la línea base de ImageView llegue a la parte inferior. Otras vistas se pueden alinear utilizando la parte inferior de ImageView, que a su vez es la misma que la línea de base de TextView.
Sin embargo, esto solo soluciona el fondo de relleno, no la parte superior.
setIncludeFontPadding (boolean includepad)
o en XML
esto sería:
android:includeFontPadding="false"
Establezca si el TextView
incluye un relleno extra superior e inferior para dejar espacio a los acentos que superan el ascenso y descenso normal. El defecto es cierto.