La respuesta de @Jimbo es correcta, definitivamente funciona para mi caso en inputtext y textview para el idioma árabe de entrada y visualización de derecha a izquierda, pero para el texto de entrada tuve que agregar también gravity = "right"
Tras un análisis más detallado, podría darle una oportunidad a android: gravity = "fill_horizontal". Eso se describe como "Aumentar el tamaño horizontal del objeto si es necesario para que llene completamente su contenedor", pero no sé cómo "crecen" el texto.
CommonsWare
8
android: gravity = "fill_horizontal" tampoco funcionó. Parece que Android no admite justificación, después de todo, bueno :)
@CommonsWare Ahora, ¿hay alguna forma adecuada de justificar el texto?
John R
1
Hombre, estoy viviendo con una gran vista web para lograr esto, y créanme, mi interfaz de usuario llora por algunas cosas nuevas que aún no se han agregado a la API, porque es muy lento para componentes como el chat en una vista de lista.
nobalG
156
La respuesta @CommonsWare es correcta. Android 8.0+ es compatible con "Justificación completa" (o simplemente "Justificación", como a veces se hace referencia de manera ambigua).
Android también es compatible con "Alineación de texto al ras / izquierda". Vea el artículo de Wikipedia sobre la justificación para la distinción. Muchas personas consideran que el concepto de 'justificación' abarca la justificación completa, así como la alineación de texto izquierda / derecha, que es lo que terminan buscando cuando quieren alinear texto a izquierda / derecha. Esta respuesta explica cómo lograr la alineación de texto izquierda / derecha.
Es posible lograr la alineación de texto al ras / izquierda (a diferencia de la justificación completa, ya que la pregunta es sobre). Para demostrarlo, usaré un formulario básico de 2 columnas (etiquetas en la columna izquierda y campos de texto en la columna derecha) como ejemplo. En este ejemplo, el texto en las etiquetas de la columna izquierda estará alineado a la derecha para que aparezcan alineados con sus campos de texto en la columna derecha.
En el diseño XML, puede hacer que los elementos TextView (la columna izquierda) se alineen a la derecha agregando el siguiente atributo dentro de todas las TextViews:
Sin embargo, si el texto se ajusta a varias líneas, el texto seguirá alineado dentro de TextView. Al agregar el siguiente atributo, el texto real se alinea a la derecha (irregular hacia la izquierda) dentro de TextView:
Entonces, el atributo de gravedad especifica cómo alinear el texto dentro de TextView layout_gravity especifica cómo alinear / diseñar el elemento TextView en sí.
Si entiendo correctamente, y dados los resultados de probar esto, todo lo que hace es alinear el texto hacia la izquierda o hacia la derecha. Esto no justifica el texto, ¿verdad?
Paul Lammertsma
14
Excelente. Solo para agregar, si desea una justificación central, puede hacerlo android:layout_gravity="center_horizontal|center"android:gravity="center".
Luis A. Florit
Definitivamente trabajando para mi caso en inputtext y textview para el idioma árabe de entrada y visualización de derecha a izquierda
shareef
1
Esto es solo alineación, no justificación. Lea ese enlace de Wikipedia con cuidado. La diferencia entre los diferentes tipos de justificación solo afecta la última línea de un párrafo. No hay justificación izquierda / derecha / centro para los párrafos que solo tienen una línea.
Karu
entonces por qué incluso respondiendo aquí si no se tratajustify
<stringname="hello">
<![CDATA[<html><head></head><bodystyle="text-align:justify;color:gray;background-color:black;">
Lorem ipsum dolor sit amet, consectetur
adipiscing elit. Nunc pellentesque, urna
nec hendrerit pellentesque, risus massa</body></html>
]]></string>
Todavía no puedo subir imágenes para probarlo, pero "funciona para mí".
Buena solución aquí. FWIW no necesita la mayoría del html extra. La etiqueta del cuerpo con el texto alineado es suficiente.
gnac
55
Esto funciona bien Tenga en cuenta que puede hacer que el fondo sea transparente siguiendo view.loadData()con view.setBackgroundColor("#00000000").
Paul Lammertsma
Sin embargo, no he logrado que cargue una fuente / tipografía personalizada. He intentado esto y esta sugerencia, sin suerte.
Paul Lammertsma
2
Como mencioné en esos hilos, encontré una resolución: si crea un archivo HTML y lo coloca en los activos, lo carga a través de view.loadUrl()trabajos, mientras view.loadData()que no lo hace. No tengo idea de por qué este último no.
Paul Lammertsma
1
@PaulLammertsma, setBackgroundColor (0x00000000) preferiría ser el formato correcto para configurar el fondo transparente.
Richey 01 de
100
ACTUALIZADO
Hemos creado una clase simple para esto. Actualmente hay dos métodos para lograr lo que está buscando. Ambos no requieren WEBVIEW y SOPORTAN ESPANABLES .
Es realmente una ayuda, pero usarlo, mi TextViews no mantiene el formato original, lo recomiendo: márgenes, estilo de texto, y creo que el tamaño del texto tampoco, Plese continúa trabajando en ello, debería ser una gran ayuda
Leonardo Sapuy
Bueno, no puedo establecer esas clases. uno de ellos no tenía ningún nombre de paquete, el otro da un error amarillo. En realidad no puedo confiar.
mehmet
Buena lib, pero todavía no sé cómo agregar ningún formato al texto usando esta biblioteca.
Semántico
44
Gracias por esta gran biblioteca compartida, pero no puede soportar texto persa o árabe. Cuando establezco la dirección, mi palabra se dibuja del último al comienzo, en lugar de comenzar al último. Quiero decir esto: mi palabra es: "سلام" y su sorteo es así: "مالس". (si no entiendes el persa mira este ejemplo: déjame "1234" -> "4321")
Naruto Uzumaki
1
Basado en scrollView ... Buena solución, sin embargo, no puedo encontrar ninguna respuesta que lo haga posible con textview. :(
superUser
88
TextViewen Android Oofertas justificación completa (nueva alineación tipográfica) en sí.
Esperemos que vuelva a la biblioteca de soporte y luego O :)
Stefan Haustein
2
¡Por favor agregue la biblioteca aquí!
Kunal Dharaiya
44
¿Cómo justificar el uso de XML?
Vikash Parajuli
14
Puede usar android: justificationMode = "inter_word" en xml.
Christian D
55
Se requiere API 26 para Android: justificationMode.
Bink
42
Puede usar el proyecto JustifiedTextView para Android en github. Esta es una vista personalizada que simula texto justificado para usted. Es compatible con Android 2.0+ y los idiomas de derecha a izquierda.
hola Saeed, tnx por tu ayuda, ¿hay alguna forma de admitir vistas de texto que se puedan intercambiar?
Hamid Reza
@SaeedZarinfam Intenté usar "JustifiedTextView para Android", pero recibí un error en la etiqueta xml ir.noghteh.JustifiedTextView me ayudaría en esta pregunta stackoverflow.com/questions/37911376/…
Jumong
30
Escribo una base de widgets en la vista de texto nativa para hacerlo.
Lo recomiendo, principalmente porque se basa en la vista de texto original del SDK oficial de Android, que en mi opinión personal es mucho más ligera que la técnica de la vista web que muchas personas publican con respecto a este tema común. Si crea una aplicación que necesita memoria, usando objetos de vista de lista, por ejemplo, podría considerar usar algo como esto. Ya lo probé y funciona como se esperaba. Si ustedes conocen a otro mejor o como este 1, por favor podrían compartir su experiencia conmigo.
superUser
Buen trabajo por cierto. Lo que estaba buscando
superUser
55
no admite lenguajes RTL como el persa
fuego en el hoyo
1
@Frank Cheng Biblioteca muy útil. Obtengo muchos espacios al final del párrafo. ¿Cómo puedo arreglarlo?
iSrinivasan27
1
funcionó para mí, pero la última línea de la vista de texto se cortó. Tuve que seguir bajando 5 para la vista de texto.
TharakaNirmana
23
Encontré una manera de resolver este problema, pero esto puede no ser muy elegante, pero el efecto no es malo.
Su principio es reemplazar los espacios de cada línea al ImageSpan de ancho fijo (el color es transparente).
WebView view =(WebView) findViewById(R.id.textContent);String text;
text ="<html><body><p align=\"justify\">";
text+="This is the text will be justified when displayed!!!";
text+="</p></body></html>";
view.loadData(text,"text/html","utf-8");
Esto puede resolver su problema. Funcionó completamente para mí.
Así es como lo hice, creo que de la manera más elegante que pude. Con esta solución, las únicas cosas que debe hacer en sus diseños son:
agregar una xmlnsdeclaración adicional
cambiar el TextViewespacio de nombres de texto de su s de android a su nuevo espacio de nombres
reemplaza tu TextViews conx.y.z.JustifiedTextView
Aquí está el código. Funciona perfectamente bien en mis teléfonos (Galaxy Nexus Android 4.0.2, Galaxy Teos Android 2.1). Siéntase libre, por supuesto, de reemplazar el nombre de mi paquete con el suyo.
/assets/justified_textview.css :
body {
font-size:1.0em;
color: rgb(180,180,180);
text-align: justify;}@media screen and(-webkit-device-pixel-ratio:1.5){/* CSS for high-density screens */
body {
font-size:1.05em;}}@media screen and(-webkit-device-pixel-ratio:2.0){/* CSS for extra high-density screens */
body {
font-size:1.1em;}}
Necesitamos configurar el renderizado en software para obtener un fondo transparente en Android 3+. De ahí el try-catch para versiones anteriores de Android.
¡Espero que esto ayude!
PD: no sea útil agregar esto a toda su actividad en Android 3+ para obtener el comportamiento esperado: android:hardwareAccelerated="false"
Esta es una solución basada en webView. Cualquiera ha encontrado aún la vista de texto basada, considerando que la vista de texto es más ligera que la vista web y la vista de desplazamiento.
Si bien aún no se completa el texto justificado, ahora puede equilibrar las longitudes de línea utilizando android:breakStrategy="balanced"API 23 en adelante
Agregue la clase anterior a su carpeta src y use este código de muestra para agregar a su diseño:
JustifiedTextView jtv=newJustifiedTextView(getApplicationContext(),"Lorem ipsum dolor sit amet... ");LinearLayout place =(LinearLayout) findViewById(R.id.book_profile_content);
place.addView(jtv);
publicclassTextViewExextendsTextView{privatePaint paint =newPaint();privateString[] blocks;privatefloat spaceOffset =0;privatefloat horizontalOffset =0;privatefloat verticalOffset =0;privatefloat horizontalFontOffset =0;privatefloat dirtyRegionWidth =0;privateboolean wrapEnabled =false;int left, top, right, bottom =0;privateAlign _align =Align.LEFT;privatefloat strecthOffset;privatefloat wrappedEdgeSpace;privateString block;privateString wrappedLine;privateString[] lineAsWords;privateObject[] wrappedObj;privateBitmap cache =null;privateboolean cacheEnabled =false;publicTextViewEx(Context context,AttributeSet attrs,int defStyle){super(context, attrs, defStyle);// set a minimum of left and right padding so that the texts are not too// close to the side screen// this.setPadding(10, 0, 10, 0);}publicTextViewEx(Context context,AttributeSet attrs){super(context, attrs);// this.setPadding(10, 0, 10, 0);}publicTextViewEx(Context context){super(context);// this.setPadding(10, 0, 10, 0);}@Overridepublicvoid setPadding(int left,int top,int right,int bottom){// TODO Auto-generated method stubsuper.setPadding(left +10, top, right +10, bottom);}@Overridepublicvoid setDrawingCacheEnabled(boolean cacheEnabled){this.cacheEnabled = cacheEnabled;}publicvoid setText(String st,boolean wrap){
wrapEnabled = wrap;super.setText(st);}publicvoid setTextAlign(Align align){
_align = align;}@SuppressLint("NewApi")@Overrideprotectedvoid onDraw(Canvas canvas){// If wrap is disabled then,// request original onDrawif(!wrapEnabled){super.onDraw(canvas);return;}// Active canas needs to be set// based on cacheEnabledCanvas activeCanvas =null;// Set the active canvas based on// whether cache is enabledif(cacheEnabled){if(cache !=null){// Draw to the OS provided canvas// if the cache is not empty
canvas.drawBitmap(cache,0,0, paint);return;}else{// Create a bitmap and set the activeCanvas// to the one derived from the bitmap
cache =Bitmap.createBitmap(getWidth(), getHeight(),Config.ARGB_4444);
activeCanvas =newCanvas(cache);}}else{// Active canvas is the OS// provided canvas
activeCanvas = canvas;}// Pull widget properties
paint.setColor(getCurrentTextColor());
paint.setTypeface(getTypeface());
paint.setTextSize(getTextSize());
paint.setTextAlign(_align);
paint.setFlags(Paint.ANTI_ALIAS_FLAG);// minus out the paddings pixel
dirtyRegionWidth = getWidth()- getPaddingLeft()- getPaddingRight();int maxLines =Integer.MAX_VALUE;int currentapiVersion = android.os.Build.VERSION.SDK_INT;if(currentapiVersion >= android.os.Build.VERSION_CODES.JELLY_BEAN){
maxLines = getMaxLines();}int lines =1;
blocks = getText().toString().split("((?<=\n)|(?=\n))");
verticalOffset = horizontalFontOffset = getLineHeight()-0.5f;// Temp// fix
spaceOffset = paint.measureText(" ");for(int i =0; i < blocks.length && lines <= maxLines; i++){
block = blocks[i];
horizontalOffset =0;if(block.length()==0){continue;}elseif(block.equals("\n")){
verticalOffset += horizontalFontOffset;continue;}
block = block.trim();if(block.length()==0){continue;}
wrappedObj =TextJustifyUtils.createWrappedLine(block, paint,
spaceOffset, dirtyRegionWidth);
wrappedLine =((String) wrappedObj[0]);
wrappedEdgeSpace =(Float) wrappedObj[1];
lineAsWords = wrappedLine.split(" ");
strecthOffset = wrappedEdgeSpace !=Float.MIN_VALUE ? wrappedEdgeSpace
/(lineAsWords.length -1):0;for(int j =0; j < lineAsWords.length; j++){String word = lineAsWords[j];if(lines == maxLines && j == lineAsWords.length -1){
activeCanvas.drawText("...", horizontalOffset,
verticalOffset, paint);}elseif(j ==0){// if it is the first word of the line, text will be drawn// starting from right edge of textviewif(_align ==Align.RIGHT){
activeCanvas.drawText(word, getWidth()-(getPaddingRight()), verticalOffset, paint);// add in the paddings to the horizontalOffset
horizontalOffset += getWidth()-(getPaddingRight());}else{
activeCanvas.drawText(word, getPaddingLeft(),
verticalOffset, paint);
horizontalOffset += getPaddingLeft();}}else{
activeCanvas.drawText(word, horizontalOffset,
verticalOffset, paint);}if(_align ==Align.RIGHT)
horizontalOffset -= paint.measureText(word)+ spaceOffset
+ strecthOffset;else
horizontalOffset += paint.measureText(word)+ spaceOffset
+ strecthOffset;}
lines++;if(blocks[i].length()>0){
blocks[i]= blocks[i].substring(wrappedLine.length());
verticalOffset += blocks[i].length()>0? horizontalFontOffset
:0;
i--;}}if(cacheEnabled){// Draw the cache onto the OS provided// canvas.
canvas.drawBitmap(cache,0,0, paint);}}}
En Android, para justificar el texto a la izquierda y no tener truncamiento del color de fondo, intente esto, funcionó para mí, produciendo resultados consistentes en Android, FF, ie y Chrome, pero debe medir el espacio que queda entre el texto. al calcular el relleno.
Android aún no admite la justificación completa. Podemos usar Webview y justificar HTML en lugar de usar textview. Funciona muy bien Si ustedes no están claros, no duden en preguntarme :)
No, eso centra el texto. No lo justifica. Citando Wikipedia : "En el texto justificado, los espacios entre palabras y, en menor medida, entre glifos o letras (interletraje), se estiran o a veces se comprimen para que el texto se alinee con los márgenes izquierdo y derecho".
CommonsWare
el texto no está justificado por su código, sino que es el centro del texto horizontal
Respuestas:
No creo que Android admita una justificación completa.
ACTUALIZACIÓN 2018-01-01 : Android 8.0+ admite modos de justificación con
TextView
.fuente
La respuesta @CommonsWare es correcta. Android 8.0+ es compatible con "Justificación completa" (o simplemente "Justificación", como a veces se hace referencia de manera ambigua).
Android también es compatible con "Alineación de texto al ras / izquierda". Vea el artículo de Wikipedia sobre la justificación para la distinción. Muchas personas consideran que el concepto de 'justificación' abarca la justificación completa, así como la alineación de texto izquierda / derecha, que es lo que terminan buscando cuando quieren alinear texto a izquierda / derecha. Esta respuesta explica cómo lograr la alineación de texto izquierda / derecha.
Es posible lograr la alineación de texto al ras / izquierda (a diferencia de la justificación completa, ya que la pregunta es sobre). Para demostrarlo, usaré un formulario básico de 2 columnas (etiquetas en la columna izquierda y campos de texto en la columna derecha) como ejemplo. En este ejemplo, el texto en las etiquetas de la columna izquierda estará alineado a la derecha para que aparezcan alineados con sus campos de texto en la columna derecha.
En el diseño XML, puede hacer que los elementos TextView (la columna izquierda) se alineen a la derecha agregando el siguiente atributo dentro de todas las TextViews:
Sin embargo, si el texto se ajusta a varias líneas, el texto seguirá alineado dentro de TextView. Al agregar el siguiente atributo, el texto real se alinea a la derecha (irregular hacia la izquierda) dentro de TextView:
Entonces, el atributo de gravedad especifica cómo alinear el texto dentro de TextView layout_gravity especifica cómo alinear / diseñar el elemento TextView en sí.
fuente
android:layout_gravity="center_horizontal|center"
android:gravity="center"
.justify
Para justificar texto en Android utilicé WebView
y html.
Todavía no puedo subir imágenes para probarlo, pero "funciona para mí".
fuente
view.loadData()
conview.setBackgroundColor("#00000000")
.view.loadUrl()
trabajos, mientrasview.loadData()
que no lo hace. No tengo idea de por qué este último no.ACTUALIZADO
Hemos creado una clase simple para esto. Actualmente hay dos métodos para lograr lo que está buscando. Ambos no requieren WEBVIEW y SOPORTAN ESPANABLES .
BIBLIOTECA : https://github.com/bluejamesbond/TextJustify-Android
SOPORTES : Android 2.0 a 5.X
PREPARAR
CAPTURA DE PANTALLA
fuente
TextView
enAndroid O
ofertas justificación completa (nueva alineación tipográfica) en sí.Solo necesitas hacer esto:
Kotlin
Java
por defecto es
JUSTIFICATION_MODE_NONE
.fuente
Puede usar el proyecto JustifiedTextView para Android en github. Esta es una vista personalizada que simula texto justificado para usted. Es compatible con Android 2.0+ y los idiomas de derecha a izquierda.
fuente
Escribo una base de widgets en la vista de texto nativa para hacerlo.
github
fuente
Encontré una manera de resolver este problema, pero esto puede no ser muy elegante, pero el efecto no es malo.
Su principio es reemplazar los espacios de cada línea al ImageSpan de ancho fijo (el color es transparente).
Puse el código en GitHub: https://github.com/twiceyuan/TextJustification
Visión general:
fuente
Diseño XML: declare WebView en lugar de TextView
Código Java: establezca datos de texto en WebView
Esto puede resolver su problema. Funcionó completamente para mí.
fuente
Así es como lo hice, creo que de la manera más elegante que pude. Con esta solución, las únicas cosas que debe hacer en sus diseños son:
xmlns
declaración adicionalTextView
espacio de nombres de texto de su s de android a su nuevo espacio de nombresTextView
s conx.y.z.JustifiedTextView
Aquí está el código. Funciona perfectamente bien en mis teléfonos (Galaxy Nexus Android 4.0.2, Galaxy Teos Android 2.1). Siéntase libre, por supuesto, de reemplazar el nombre de mi paquete con el suyo.
/assets/justified_textview.css :
/res/values/attrs.xml :
/res/layout/test.xml :
/src/net/bicou/myapp/widget/JustifiedTextView.java :
Necesitamos configurar el renderizado en software para obtener un fondo transparente en Android 3+. De ahí el try-catch para versiones anteriores de Android.
¡Espero que esto ayude!
PD: no sea útil agregar esto a toda su actividad en Android 3+ para obtener el comportamiento esperado:
android:hardwareAccelerated="false"
fuente
Muy simple Podemos hacer eso en el archivo xml
fuente
Si bien aún no se completa el texto justificado, ahora puede equilibrar las longitudes de línea utilizando
android:breakStrategy="balanced"
API 23 en adelantehttp://developer.android.com/reference/android/widget/TextView.html#attr_android:breakStrategy
fuente
Escribo mi propia clase para resolver este problema, aquí es solo tienes que llamar a la función de justificación estática que toma dos argumentos
//Actividad principal
// TextJustificationClass
// XML
fuente
FILL_HORIZONTAL
es equivalente aCENTER_HORIZONTAL
. Puede ver este fragmento de código en el código fuente de textview:fuente
Hay una vista personalizada para este problema, esta vista de texto personalizada es compatible con la vista de texto justificado.
Saquea esto: JustifiedTextView
Agregue la clase anterior a su carpeta src y use este código de muestra para agregar a su diseño:
fuente
ver aquí en el github
Simplemente importe los dos archivos "TextJustifyUtils.java" y "TextViewEx.java" en su proyecto.
y
Ahora, si usa textView normal como:
Simplemente use
Definir una variable y establecer justificar como verdadero
fuente
Texto de Android Justify para TextView XML
Simplemente justifique el texto de Android con XML. Simplemente puede implementar en el widget de vista de texto.
El valor predeterminado es
android:justificationMode="none"
fuente
Creo que hay dos opciones:
Use algo como Pango que se especialice en esto a través del NDK y renderice texto en un OpenGL u otra superficie.
Use Paint.measureText () y sus amigos para obtener la longitud de las palabras y colocarlas manualmente en un lienzo en una vista personalizada.
fuente
En Android, para justificar el texto a la izquierda y no tener truncamiento del color de fondo, intente esto, funcionó para mí, produciendo resultados consistentes en Android, FF, ie y Chrome, pero debe medir el espacio que queda entre el texto. al calcular el relleno.
El truco es el
padding-right:1000px;
que empuja el texto al extremo izquierdo.Cualquier intento de ir a la izquierda o justificar el código en css o html da como resultado un fondo de solo medio ancho.
fuente
Para formatear html no necesita llamar al Webkit, puede usar
Html.fromHtml(text)
para hacer el trabajo.Fuente: http://developer.android.com/guide/topics/resources/string-resource.html
fuente
Android aún no admite la justificación completa. Podemos usar Webview y justificar HTML en lugar de usar textview. Funciona muy bien Si ustedes no están claros, no duden en preguntarme :)
fuente
WebView
transparent
. Tengo una imagen de fondo.Pruebe esta solución en el siguiente enlace, simplemente cree esa clase en la carpeta del proyecto y úsela. Funciona bien para mí :)
¿Justifica el texto en una aplicación de Android con WebView pero presenta una interfaz similar a TextView?
fuente
Justificación del contenido de TextView: es fácil usar solo android: justificationMode = "inter_word" dentro de su etiqueta TextView.
fuente
Intente usar <
RelativeLayout >
(asegurándose de llenar_parente), luego simplemente agregueandroid:layout_alignParentLeft="true"
yandroid:layout_alignParentRight="true"
a los elementos que desea en el exterior IZQUIERDO Y DERECHO.BLAM, justificado!
fuente
Tienes que configurar
y
fuente
Esto realmente no justifica su texto pero
es la mejor opción que tienes
fuente