studio plain example espaƱol edittext and java android textview

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 &nbsp; en mi cadena!

value.replaceAll("//s", " ");

¡Gracias a todos!