versiones tipos informatica historia cuadro comparativo caracteristicas java android xml textview

java - tipos - Forzar palabra siguiente a una nueva línea si la palabra es demasiado larga para la vista de texto



tipos de html (3)

Primero, puede obtener la pintura de texto usando TextView.getPaint() , luego cada vez que agrega una nueva palabra (Hola, yo, soy, etc.), llame a measureText en la pintura. Si la longitud del resultado es más larga que el ancho disponible de su TextView, agregue /n antes de la nueva palabra. Restaure los datos y repita los pasos.

Tengo un TextView , que cuando se rellena programáticamente no se rompe la línea correctamente en las palabras.

Salida de corriente:

Esto es lo que está pasando:

| Hi I am an examp | | le of a string t | | hat is not break | | ing correctly on | | words |

Rendimiento esperado:

Quiero esto:

| Hi I am an | | example of a | | string that is | | breaking | | correctly on | | words |

Java:

String mQuestion = "Hi I am an example of a string that is breaking correctly on words"; mTextView.setText(mQuestion);

XML:

<LinearLayout android:id="@+id/questionContainer" android:layout_width="match_parent" android:layout_height="wrap_content" android:orientation="vertical" > <TextView android:id="@+id/questionHeaderTextView" android:layout_width="match_parent" android:layout_height="wrap_content" android:background="@color/header_bg" android:paddingBottom="10dp" android:paddingLeft="25dp" android:paddingTop="10dp" android:text="@string/category_hint" android:textAppearance="?android:attr/textAppearanceLarge" /> <LinearLayout android:layout_width="match_parent" android:layout_height="wrap_content" android:orientation="horizontal" > <Space android:layout_width="0dp" android:layout_height="match_parent" android:layout_weight=".05" /> <!-- THIS ONE WILL NOT WRAP !--> <TextView android:id="@+id/questionHolderTextView" android:layout_width="0dp" android:layout_height="wrap_content" android:layout_weight=".9" android:layout_marginBottom="15dp" android:layout_marginTop="15dp" android:layout_marginLeft="15dp" android:layout_marginRight="15dp" android:text="@string/question_holder" android:singleLine="false" android:scrollHorizontally="false" android:ellipsize="none" android:textSize="20sp" /> <Space android:layout_width="0dp" android:layout_height="match_parent" android:layout_weight=".05" /> </LinearLayout> <View android:layout_width="match_parent" android:layout_height="0.5dp" android:layout_marginTop="5dp" android:background="@color/black" /> </LinearLayout> <LinearLayout android:id="@+id/answerContainer" android:layout_width="match_parent" android:layout_height="wrap_content" android:orientation="vertical" android:visibility="visible" > </LinearLayout> <LinearLayout android:layout_width="match_parent" android:layout_height="wrap_content" android:orientation="horizontal" android:layout_marginTop="25dp" android:gravity="center" > <Button android:id="@+id/nextButton" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_marginLeft="25dp" android:text="@string/next" /> </LinearLayout>


Terminé usando

private void initView() { Paint paint = new Paint(); float width = paint.measureText(mQuestion); int maxLength = 300; // put whatever length you need here if (width > maxLength) { List<String> arrayList = null; String[] array = (mQuestion.split("//s")); arrayList = Arrays.asList(array); int seventyPercent = (int) (Math.round(arrayList.size() * 0.70)); // play with this if needed String linebreak = arrayList.get(seventyPercent) + "/n"; arrayList.set(seventyPercent, linebreak); mQuestion = TextUtils.join(" ", arrayList); mQuestion.replace(",", " "); } mQuestionHolderTextView.setText(mQuestion); }

Mido la cuerda, la convierto en una lista, luego la divido al 70% y hago una nueva línea. Luego vuelvo a convertir la Lista en una Cadena y elimino las comas. Siempre que la palabra no supere el 30% de la línea restante, estará limpio, de lo contrario, ajuste en consecuencia.

Es rápido y sucio, pero funcionó para mí.


Usando el siguiente método, puede obtener el texto envuelto.

Como no tengo Android configurado, entonces escribí una clase de prueba y llamé al método desde main. Debes pasar el ancho de la vista de texto. Pasé 14 aquí.

public class Test{ public static void main(String[] args) { String wrappedText=wrapText(14); System.out.println(wrappedText); } public static String wrapText(int textviewWidth) { String mQuestion = "Hi I am an example of a string that is breaking correctly on words"; String temp = ""; String sentence = ""; String[] array = mQuestion.split(" "); // split by space for (String word : array) { if ((temp.length() + word.length()) < textviewWidth) { // create a temp variable and check if length with new word exceeds textview width. temp += " "+word; } else { sentence += temp+"/n"; // add new line character temp = word; } } return (sentence.replaceFirst(" ", "")+temp); } }

Salida -

Hi I am an example of a string that is breaking correctly on words