TextView用字母打破了我的话

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了TextView用字母打破了我的话相关的知识,希望对你有一定的参考价值。

我的要求:按内容宽度和最大宽度90%创建“入泡”。

我有这个标记:

<?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>

有时我得到以下结果:bad word wrapping

但我希望得到以下结果(它错误地鼓励Android Studio预览中的屏幕截图):expected word wrapping

我怎样才能防止用字母打破单词restaraunt

UPDATE

虽然我使用minSdk = 15我尝试使用breakStrategy但我没有得到预期的结果。 android:breakStrategy="simple"simple break strategy

android:breakStrategy="balanced"balanced break strategy

我发现了一个相关的问题:Force next word to a new line if the word is too long for the textview,但我没有说明如何使用layout_width="wrap_content获得TextView的最大可用宽度?

如果我可以覆盖TextView.setText并在需要时在那里放置换行符,那将是很棒的。

答案

您可以使用webview来实现此行为。在webview中,您可以使用css来调整文本。看看this answer


更新

您可以计算字符串的宽度并将 添加到字符串需要拆分的字符串

Rect bounds = new Rect(); 
Paint textPaint = textView.getPaint(); 
 textPaint.getTextBounds(text, 0, text.length(), bounds); 
 int height = bounds.height(); 
int width = bounds.width();

结果以像素为单位,因此只需检查view或屏幕的宽度并分割字符串。


UPDAE2:示例代码

我刚刚在活动onCreate中编写了一个简单布局的示例,您可以在适配器中实现它或者适合您的任何东西。

    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
"); // regex to replace each group(lineMax) of Chars with group of char + new line
        textView.setText(result);
    } else
        textView.setText(text);

更新#3: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();

my adapter.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
"); // 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+"
"; // 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>

Result in device

另一答案

对文本视图使用MaxWidth属性,否则应为textview提供宽度

   <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" />
另一答案

试试这个

<TextView
        android:id="@+id/tvValue"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:layout_gravity="center_vertical"
    

以上是关于TextView用字母打破了我的话的主要内容,如果未能解决你的问题,请参考以下文章

用片段替换某些东西

使用选择时,TextView 的波纹效果卡在长按上

在 AsyncTask 中将新的 TextView 设置为片段

片段中的TextView在Android Studio中返回Null

我在这个模型中打破了我的聚合边界吗?

片段没有被 RecyclerView 膨胀