para - programacion android pdf 2018
TextView se corta en algunas resoluciones (12)
Creo que no deberías arreglar el spanCount
de GridLayout
. Sería mejor si para high resolutions
mostrara 4 elementos, para small resolutions
muestre 3 elementos, para landscape display
5 elementos, ...
Para hacerlo, debe crear una constants
para todos los valores de la carpeta que admitirá como
res/values-small/dimens.xml
constants.xml
res/values-large/dimens.xml
constants.xml
para cada constants.xml
, se verá como
<resources>
<integer name="span_count">3</integer>
</resources>
Luego cuando creas GridLayoutManager
GridLayoutManager lm = new GridLayoutManager(Context context, getContext().getResources().getInteger(R.integer.span_count));
Después de que hagas esto, tu problema no pasará.
Tengo un RecyclerView
que consiste en CardView
s que tienen un TextView
y un ImageView
, entre algunos otros diseños.
El problema es que, en algunas resoluciones de pantalla, el TextView
se corta o se TextView
a la siguiente línea, que no quiero.
En otras resoluciones, el TextView
tiene mucho espacio.
¿Cómo organizo el diseño para que haya suficiente espacio para el TextView
, y el ImageView
se dimensionará en consecuencia?
Este es mi xml para los elementos RecyclerView
:
<android.support.v7.widget.CardView xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:cardview="http://schemas.android.com/apk/res-auto"
android:id="@+id/zmanCard"
android:layout_width="match_parent"
android:layout_height="50dp"
android:layout_gravity="center_horizontal"
android:gravity="center_horizontal"
cardview:cardUseCompatPadding="false"
cardview:cardPreventCornerOverlap="false"
cardview:cardCornerRadius="4dp"
cardview:cardElevation="2dp">
<LinearLayout
android:layout_width="match_parent"
android:layout_height="match_parent"
android:background="?attr/colorPrimary"
android:orientation="vertical">
<LinearLayout
android:layout_width="match_parent"
android:layout_height="20dp"
android:layout_gravity="top"
android:gravity="center"
android:orientation="vertical"
android:background="?attr/colorPrimaryDark">
<TextView
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:id="@+id/zmanCardTitle"
android:textColor="#ffffff"
android:gravity="center"
android:textSize="13sp" />
</LinearLayout>
<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:orientation="horizontal">
<ImageView
android:layout_width="24dp"
android:layout_height="wrap_content"
android:layout_marginTop="2dp"
android:layout_marginLeft="2dp"
android:layout_marginRight="4dp"
android:alpha="0.8"
android:id="@+id/zmanCardImage" />
<FrameLayout
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginTop="7dp"
android:layout_marginLeft="0dp"
android:layout_marginRight="4dp">
<TextView
android:text="5:40"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginLeft="2dp"
android:id="@+id/zmanCardTime"
android:textColor="#ffffff"
android:textSize="18sp" />
<ProgressBar
android:id="@+id/zmanProgressBar"
android:layout_width="24dp"
android:layout_height="24dp"
android:layout_gravity="top|left"
style="@style/Base.Widget.AppCompat.ProgressBar" />
</FrameLayout>
</LinearLayout>
</LinearLayout>
De una manera más sencilla, cree su diseño utilizando un diseño relativo con alguna técnica adecuada que se resolverá. Si aún tiene problemas, pídame un archivo .xml.
Debe usar el relleno para que la vista de texto siempre tenga un relleno fijo y nunca se corte. En su código realice los siguientes cambios.
<TextView
android:text="5:40"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginLeft="2dp"
android:id="@+id/zmanCardTime"
android:textColor="#ffffff"
android:padding:"3dp"
android:textSize="18sp" />
Mi experiencia en Android siempre uso dp en lugar de sp, así que arregla el valor de dp para todas las vistas de texto y se ajustará a cualquier pantalla.
Déjame saber si hay algún problema.
Mejores regds
Prueba esto. Funciona al 100%.
AutoResizeTextView unidad AutoResizeTextView o sdp puede ayudarlo.
sdp - una unidad de tamaño escalable
Un SDK de Android que proporciona una nueva unidad de tamaño - sdp ( dp escalable ). Esta unidad de tamaño se escala con el tamaño de la pantalla. Puede ayudar a los desarrolladores de Android con el soporte de múltiples pantallas.
para las vistas de texto, consulte ssp que se basa en la unidad de tamaño sp para textos.
Y si quieres soportar diferentes diseños de diseño para diferentes pantallas:
res/layout/my_layout.xml // layout for normal screen size ("default")
res/layout-small/my_layout.xml // layout for small screen size
res/layout-large/my_layout.xml // layout for large screen size
res/layout-xlarge/my_layout.xml // layout for extra large screen size
res/layout-xlarge-land/my_layout.xml // layout for extra large in landscape orientation
Para más información mira here
Puedo sugerir la solución de dos pasos uno para el tamaño del texto, por lo que con el atributo wrap_content
se ajusta al texto y sugiero usar un calificador para proporcionar varios diseños alternativos para diferentes configuraciones de pantalla. Lo hace utilizando calificadores de configuración, que permiten que el tiempo de ejecución seleccione automáticamente el recurso apropiado según la configuración del dispositivo actual (como un diseño de diseño diferente para diferentes tamaños de pantalla). Soportar diferentes tamaños de pantalla
desde esta parte hasta el final copié mi respuesta de este enlace de la respuesta de @ Herry: Creo que debe consultar este Pdf de Google IO para el diseño . En ese pdf, vaya a la página No: 77, donde encontrará sugerencias para usar dimens.xml
para diferentes dispositivos de Android, por ejemplo, vea la siguiente estructura:
res / values / dimens.xml
res / values-small / dimens.xml
res / values-normal / dimens.xml
res / values-large / dimens.xml
res / values-xlarge / dimens.xml
Por ejemplo, usted ha usado debajo de dimens.xml en valores.
<?xml version="1.0" encoding="utf-8"?>
<resources>
<dimen name="text_size">18sp</dimen>
</resources>
En la carpeta de otros valores, necesita cambiar los valores para el tamaño de su texto.
por ejemplo:
<resources>
<!-- Default screen margins, per the Android Design guidelines. -->
<dimen name="activity_horizontal_margin">16dp</dimen>
<dimen name="activity_vertical_margin">16dp</dimen>
<dimen name="font_size_small">10sp</dimen>
<dimen name="font_size_medium">20sp</dimen>
<dimen name="font_size_large">30sp</dimen>
</resources>
Si desea pantallas escalables, no debe usar la altura o el ancho fijos tanto como sea posible. En su caso, debe colocar sus componentes proporcionalmente con layout_weight.
Para más detalles;
Utilice AutoScaleTextView
AutoScaleTextView
toma el valor de android:textSize
y lo usa como el tamaño de texto preferido. También puede establecer el tamaño de texto mínimo. El valor predeterminado para el tamaño de texto mínimo es 10dp
. AutoScaleTextView
ahora intenta tomar el valor máximo entre el tamaño preferido y el mínimo que se ajusta al ancho de Vistas (con respecto al relleno).
Encuentre la clase completa de AutoScaleTextView y sus implementaciones en el siguiente enlace
intente dar peso al diseño de vista de texto y diseño de vista de imagen dar peso 1 a ambos diseños
Un TextView que automáticamente cambia el tamaño del texto para que se ajuste perfectamente a sus límites .
Uso:
dependencies {
compile ''me.grantland:autofittextview:0.2.+''
}
Habilitar cualquier vista extendiendo TextView en el código:
AutofitHelper.create(textView);
Habilitar cualquier vista extendiendo TextView en XML:
<me.grantland.widget.AutofitLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
>
<Button
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:singleLine="true"
/>
</me.grantland.widget.AutofitLayout>
Utilice el Widget incorporado en código o XML:
<RootElement
xmlns:autofit="http://schemas.android.com/apk/res-auto"
...
<me.grantland.widget.AutofitTextView
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:singleLine="true"
android:maxLines="2"
android:textSize="40sp"
autofit:minTextSize="16sp"
/>
Enlace de referencia: https://github.com/grantland/android-autofittextview
Solución 1
// The TEXT SIZE in dp
private static final float TEXT_SIZE_DP = 16.0f;
// Get the screen''s density scale
final float scale = getResources().getDisplayMetrics().density;
// Convert the dps to pixels, based on density scale
int textSize = (int) (TEXT_SIZE_DP * scale + 0.5f);
textView.setTextSize(TypedValue.COMPLEX_UNIT_PX,textSize);
Solución 2:
float dpi = getResources().getDisplayMetrics().widthPixels;
dpi = dpi / 320;
textView.setTextSize(TypedValue.COMPLEX_UNIT_PX,TEXT_SIZE_DP*dpi);
Cómo se refiere su trabajo a continuación enlace
http://canvasonandroid.blogspot.in/2016/04/how-to-scale-font-size-for-different.html
Nota: funcionará solo en el dispositivo, no en la tableta. Necesitamos escribir diferentes lógicas para la tableta. para esto necesitas establecer el tamaño de fuente en dimen.xml
Aquí vuelves por segunda vez con la palabra clave.
Resolución
¿Cuáles son las opciones que tiene en la mano ahora?
1 diseños múltiples 2.Múltiples dimensiones
Respuesta famosa sobre esta pregunta en particular (texto de vista de texto de escala automática para ajustar dentro de los límites)
- Uso del atributo Weight_sum
- Bibliotecas GitHub como https://github.com/grantland/android-autofittextview , sdp
¡Simplemente resumí esas respuestas (todo en uno)! ¿Quedan otras opciones?
Como puedo ver, su problema está relacionado con dos casos de la mano.
A veces, vea que TextView
se reduce. ¿Hay otras opciones que pueda intentar evitar, en lugar de las soluciones que tiene?
PercentRelativeLayout
¿Alguna ventaja extra de esto? Sí, esto admite dimensiones y márgenes basados en porcentajes. Usted ha establecido márgenes fijos y esto le dará un porcentaje. Incluso tiene un atributo genial llamado layout_aspectRatio
. Aquí hay un enlace para un pequeño tutorial .
Dar tamaños basados en la relación / posición absoluta de una vista
Antes de PercentRelativeLayout
, en su mayoría usé esto. Primero, debe tener una imagen / boceto modelo de su vista. Mi modelo es de 1920 px de altura y 1080 de ancho (normalmente es una resolución HDTV, relación de aspecto 16: 9)
En esa imagen sabemos dónde se ubican las vistas.
Luego, para cualquier vista / cualquier otra pantalla, puedo usar la misma proporción para LayoutParams
usando LayoutParams
. Ahora ve las estancias de acuerdo a tus reglas.
Aquí hay un ejemplo:
DisplayMetrics displaymetrics = new DisplayMetrics();
getWindowManager().getDefaultDisplay().getMetrics(displaymetrics);
height = displaymetrics.heightPixels;
width = displaymetrics.widthPixels;
LinearLayout.LayoutParams topLenP= new LinearLayout.LayoutParams(300 * width / 1080, 400 * width / 1920);
//topLenP.topMargin = x* height / 1920;
//topLenP.leftMargin = y* width / 1080;
myView.setLayoutParams(topLenP);
Lo que realmente hice aquí, como dije en mi vista de modelo, esta vista tomó 300 de ancho, 400 de altura, con esto estoy ajustando la misma proporción para mi pantalla de grosella (usando el tamaño de la pantalla de grosella).
Volviendo a la escala automática, ya que ahora tenemos una vista basada en la misma proporción, esta es otra buena respuesta.
Ajuste automático de TextView para Android
android: textAppearance
Finalmente, hay tamaños fijos dados en android /platforms/android-X/data/res/values/themes.xml
basado en pequeño, grande y mediano.
Sin especificar qué necesita exactamente, también puede usarlo como
<TextView
android:textAppearance="?android:attr/textAppearance"
....
/>
¡Espero que esto ayude!