如果单词对文本视图来说太长,则强制将下一个单词放到新的一行。

20 人关注

我有一个 TextView ,当以编程方式填写时,不会正确地在单词上换行。

Current Output:

这就是正在发生的事情。

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

Expected Output:

我想要这个。

| 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);
<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>
        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>
    
4 个评论
设置多行为真,同时设置文本视图的宽度。
@MeenalSharma 设置多行真?我不认为这是一个有效的xml命令,如果它是的话,我找不到它。
请清理你的评论,因为问题已经解决,这些评论不再有用了
java
android
xml
textview
i_me_mine
i_me_mine
发布于 2014-09-03
6 个回答
Annie Aye Myat
Annie Aye Myat
发布于 2021-05-18
已采纳
0 人赞同
android:breakStrategy="simple"

在你的文本视图中添加这个。这对我来说很有效!

从android sdk 23开始
suitianshi
suitianshi
发布于 2021-05-18
0 人赞同

首先,你可以用以下方法获得文本的画法 TextView.getPaint() 然后,每次你添加一个新词(Hi, I, am, etc)时,在画上调用 measureText 。如果结果长度超过你的TextView的可用宽度,在新词前添加一个 \n 。重设数据并重复这些步骤。

好的,如果你找到更好的解决方案,请告诉我。
There is no better solution. Sorry I doubted you, ;)
i_me_mine
i_me_mine
发布于 2021-05-18
0 人赞同

I ended up using

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);

我测量字符串,把它变成一个列表,然后在70%处分割,并建立一个新行。然后我把列表转回字符串并删除逗号。只要这个词不超过剩余行的30%,你就没有问题了,否则就进行相应调整。

这是快速和肮脏的,但它对我来说是有效的。

Ninad Pingale
Ninad Pingale
发布于 2021-05-18
0 人赞同

使用以下方法,你可以得到被包裹的文本。

由于我没有设置安卓系统,所以我写了一个测试类,并从main中调用该方法。 你需要传递textview的宽度。我在这里传递了14。

    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);

Output -

Hi I am an
example of a
string that is
breaking
correctly on
words
    
knighthedspi
knighthedspi
发布于 2021-05-18
0 人赞同

感谢suitianshi,以下是我的解决方案。

 private String getWidthFitString(String input) {
    Paint paint = text.getPaint();
    // you can define max width by yourself
    int maxWidth = getContentMaxWidth(); 
    float width = paint.measureText(input);
    if (width > maxWidth) {
        List<String> words = Arrays.asList(input.split("\\s"));
        int breakLinePosition = 0;
        String toBreakLineText;
        List<String> toBreakLineWords = new ArrayList<>();
        while (breakLinePosition < words.size()) {
            toBreakLineWords.add(words.get(breakLinePosition));
            toBreakLineText = TextUtils.join(" ", toBreakLineWords);
            float currentWidth = paint.measureText(toBreakLineText);
            if (currentWidth > maxWidth) {
                break;
            breakLinePosition ++;
        if (breakLinePosition > 1) {
            toBreakLineWords.remove(toBreakLineWords.size() - 1);
            toBreakLineText = TextUtils.join(" ", toBreakLineWords);
            List<String> fromBreakLineWords = new ArrayList<>();
            for (int i = breakLinePosition; i < words.size(); i++) {
                fromBreakLineWords.add(words.get(i));
            return toBreakLineText + "\n" + getWidthFitString(TextUtils.join(" ", fromBreakLineWords));
        } else {
            return input;
    return input;

它起作用了,而且代码干净。