java - plain - textview layout android
TextView rompe mi palabra por cartas (7)
Prueba esto
<TextView
android:id="@+id/tvValue"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_gravity="center_vertical"
android:padding="8dp"
android:textColor="@color/black"
android:textSize="16sp"
tools:text="I would like to go to an Italian restaurant"/>
</LinearLayout>
Mis requisitos: crear "burbuja entrante" con ancho por contenido y ancho máximo 90%.
Tengo este marcado:
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout
xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:orientation="horizontal"
android:weightSum="1.0"
tools:background="@color/white_smoke">
<LinearLayout
android:id="@+id/flBubble"
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_gravity="start"
android:background="@drawable/bubble_in"
android:layout_weight="0.9">
<ImageView
android:id="@+id/ivSay"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:background="?android:attr/selectableItemBackground"
android:contentDescription="@string/default_content_description"
android:padding="8dp"
android:src="@drawable/ic_play_circle_outline_black_24dp"
android:tint="@color/primary"/>
<TextView
android:id="@+id/tvValue"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="center_vertical"
android:padding="8dp"
android:textColor="@color/black"
android:textSize="16sp"
tools:text="I would like to go to an Italian restaurant"/>
</LinearLayout>
<View
android:layout_width="0dp"
android:layout_height="0dp"
android:layout_weight="0.1"/>
</LinearLayout>
A veces obtengo el siguiente resultado:
Pero espero el siguiente resultado (es falsamente alentador la captura de pantalla de la vista previa de Android Studio):
¿Cómo puedo evitar romper palabra restaraunt
por letras?
ACTUALIZAR
Aunque uso minSdk = 15 intenté usar breakStrategy
y no obtuve el resultado esperado. android:breakStrategy="simple"
:
android:breakStrategy="balanced"
:
Encontré una pregunta relacionada: Forzar la siguiente palabra para una nueva línea si la palabra es demasiado larga para la vista de texto , pero no entendí cómo puedo obtener el ancho máximo disponible para TextView con layout_width="wrap_content
?
Sería genial si pudiera anular TextView.setText
y colocar saltos de línea allí si fuera necesario.
Lo siento, no pude comentar
prueba esto:
android:inputType="textMultiLine"
Use la propiedad MaxWidth para la vista de texto o bien debería proporcionar el ancho para la vista de texto
<com.custom.views.CustomTextView
android:id="@+id/txt_send_chat"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="center_vertical"
android:gravity="center_vertical"
android:maxWidth="250dp"
android:textColor="@color/color_chat_sender"
android:textSize="16sp"
app:font_name="@string/font_roboto_regular" />
Puedes intentar con Autosizing TextViews
La Biblioteca de soporte técnico 26.0 ofrece soporte total para la característica de Autovecesamiento de TextView en dispositivos que ejecutan versiones de Android anteriores a Android 8.0 (nivel de API 26). La biblioteca proporciona soporte para Android 4.0 (API nivel 14) y superior. El paquete android.support.v4.widget contiene la clase TextViewCompat para acceder a las funciones de manera compatible con versiones anteriores
Por ejemplo:
<TextView
android:layout_width="match_parent"
android:layout_height="200dp"
android:autoSizeTextType="uniform" />
Para más detalles, las pautas van AQUÍ
Su biblioteca también AQUÍ
Cambie su TextView a EditText y ponga estas 2 líneas. debería ayudarte
android:inputType="textMultiLine"
android:enabled="false"
Esto colocará su texto correctamente y más adelante puede dar una función de edición en su aplicación si lo necesita.
Puede usar webview
para lograr este comportamiento. En la vista web puede usar css para ajustar el texto. Eche un vistazo a esta respuesta
Actualizar
Puede calcular el ancho de la cadena y agregar /n
a la cadena donde la cadena necesita separarse
Rect bounds = new Rect();
Paint textPaint = textView.getPaint();
textPaint.getTextBounds(text, 0, text.length(), bounds);
int height = bounds.height();
int width = bounds.width();
Los resultados están en píxeles, así que simplemente verifique el ancho de su view
o pantalla y divida la cadena.
UPDAE2: Código de ejemplo
Acabo de escribir un ejemplo con un diseño simple en la actividad en onCreate
que puedes implementar en adaptador o lo que sea que funcione para ti.
TextView textView = (TextView) findViewById(R.id.txt); //textview with empty text
Rect bounds = new Rect();
Paint textPaint = textView.getPaint();
String text = "some long text here.....";// text data to work on
textPaint.getTextBounds(text, 0, text.length(), bounds);
int textWidth = bounds.width();// get text width in pixel
int marginPadding = 100;// we have some padding and margin from xml layouts
DisplayMetrics displayMetrics = new DisplayMetrics();
getWindowManager().getDefaultDisplay().getMetrics(displayMetrics);
int rootWidth = displayMetrics.widthPixels-marginPadding;// maximum width on screan
if (textWidth > rootWidth) { // check if need to split the string.
int lineMax = (text.length() * rootWidth) / textWidth; // maximum Characters for each line
String result = text.replaceAll("(.{" + String.valueOf(lineMax) + "})", "$1/n"); // regex to replace each group(lineMax) of Chars with group of char + new line
textView.setText(result);
} else
textView.setText(text);
ACTUALIZACIÓN # 3: código fijo para Listview
onCreate
ArrayList<String> data = new ArrayList<>();
data.add("000");
data.add("aaaaaaaaaaa");
data.add("aaaaaaaaaaa bbbbbbbbbbbb");
data.add("aaaaaaaaaaa bbbbbbbbbbbb cccccccccccccccc");
data.add("aaaaaaaaaaa bbbbbbbbbbbb cccccccccccccccc ddddddddddddd");
data.add("aaaaaaaaaaa bbbbbbbbbbbb cccccccccccccccc ddddddddddddd eeeeeeeeeeeee");
data.add("aaaaaaaaaaa bbbbbbbbbbbb cccccccccccccccc ddddddddddddd eeeeeeeeeeeee ffffffffffffffffff");
data.add("aaaaaaaaaaa bbbbbbbbbbbb cccccccccccccccc ddddddddddddd eeeeeeeeeeeee ffffffffffffffffff gggggggggggggggg");
data.add("aaaaaaaaaaa bbbbbbbbbbbb cccccccccccccccc ddddddddddddd eeeeeeeeeeeee ffffffffffffffffff gggggggggggggggg hhhhhhhhhhhhhhhh");
ListView listView = (ListView) findViewById(R.id.listview);
MyAdapter adapter= new MyAdapter(data,this);
listView.setAdapter(adapter);
adapter.notifyDataSetChanged();
MyAdapter.java
public class MyAdapter extends BaseAdapter {
private LayoutInflater inflater = null;
Context context;
ArrayList<String> data;
public MyAdapter(ArrayList<String> data, Context context) {
this.context = context;
this.data = data;
inflater = (LayoutInflater) context
.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
}
@Override
public int getCount() {
return data.size();
}
@Override
public Object getItem(int i) {
return data.get(i);
}
@Override
public long getItemId(int i) {
return i;
}
@Override
public View getView(final int i, View convertView, ViewGroup viewGroup) {
final View view = inflater.inflate(R.layout.item, null);
final TextView tv_text = (TextView) view.findViewById(R.id.tvValue);
if (data.get(i) != null) {
tv_text.post(new Runnable() {
@Override
public void run() {
//TextView is Ready to be used.
fixText(data.get(i),tv_text);
}
});
}
return view;
}
private void fixText(String text, TextView textView) {
Rect bounds = new Rect();
Paint textPaint = textView.getPaint();
textPaint.getTextBounds(text, 0, text.length(), bounds);
int textWidth = bounds.width();// get text width in pixel
int marginPadding = 100;// we have some padding and margin from xml layouts
DisplayMetrics displayMetrics = new DisplayMetrics();
((MainActivity) context).getWindowManager().getDefaultDisplay().getMetrics(displayMetrics);
int rootWidth = textView.getWidth();//displayMetrics.widthPixels - marginPadding;// maximum width on screan
if (textWidth > rootWidth) { // check if need to split the string.
//int lineMax = (text.length() * rootWidth) / textWidth; // maximum Characters for each line
//String result = text.replaceAll("(.{" + String.valueOf(lineMax-5) + "})", "$1/n"); // regex to replace each group(lineMax) of Chars with group of char + new line
String result = wrapText(rootWidth,text);
textView.setText(result);
} else
textView.setText(text);
}
private String wrapText(int textviewWidth,String mQuestion) {
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);
}
item.xml
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout
xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:orientation="horizontal"
android:weightSum="1.0"
tools:background="@color/colorAccent">
<LinearLayout
android:id="@+id/flBubble"
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_gravity="start"
android:background="@color/colorPrimary"
android:layout_weight="0.9">
<ImageView
android:id="@+id/ivSay"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:background="?android:attr/selectableItemBackground"
android:contentDescription="default_content_description"
android:padding="8dp"
android:src="@android:drawable/ic_media_play"
android:tint="@color/colorPrimaryDark" />
<TextView
android:id="@+id/tvValue"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_gravity="center_vertical"
android:padding="8dp"
android:textColor="#000000"
android:textSize="16sp"
tools:text="I would like to go to an Italian restaurant jkjk l;''"/>
</LinearLayout>
<View
android:layout_width="0dp"
android:layout_height="0dp"
android:layout_weight="0.1"/>
</LinearLayout>
Dios mío, hubo
en mi cadena!
value.replaceAll("//s", " ");
¡Gracias a todos!