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