user3190568
user3190568

Reputation: 181

Prevent line-break in TextView

In my Android app I have a text view that displays text containing special characters. The TextView somehow automatically breaks strings at the characters '/' and '-'.

For example, the string "aaaaaaa/bbb-ccccc/ddd" is displayed as

aaaaaaa/
bbb-
ccccc/
ddd

However, I would like to display it without any linebreaks except the one at the boundaries of the view, i.e., like this:

aaaaaaa/bb
bb-ccccc/d
dd

Is there any way to deactivate the automatic line-breaks or to escape these characters? I already tried escaping with \uFEFF without success.

Upvotes: 18

Views: 19185

Answers (9)

Andrew Wood
Andrew Wood

Reputation: 51

Android TextView follows the standard Unicode line break algorithm: http://www.unicode.org/reports/tr14/tr14-45.html Excerpt: / Prevent a break before, and allow a break after

You can work around this by placing the 'word joiner' character (U+2060) after the slashes.

Example from strings.xml: aaaaaaa/\u2060bbb-ccccc/\u2060ddd

You can also try using android:breakStrategy="balanced" to keep the lines roughly the same length.

Upvotes: 4

yundol
yundol

Reputation: 67

this is work's for me in kotlin

object WordBreakTransformationMethod : ReplacementTransformationMethod() {
    private val dash = charArrayOf('-', '\u2011')
    private val space = charArrayOf(' ', '\u00A0')
    private val slash = charArrayOf('/', '\u2215')

    private val original = charArrayOf(dash[0], space[0], slash[0])
    private val replacement = charArrayOf(dash[1], space[1], slash[1])

    override fun getOriginal() = original
    override fun getReplacement() = replacement
}

//tv_text is TextView
tv_text.apply {
    transformationMethod = WordBreakTransformationMethod
    text = item.text
}

Upvotes: 3

Athul
Athul

Reputation: 821

Its is a new thing in Android 6.

Try adding this to your TextView xml layout

android:hyphenationFrequency="none"

Upvotes: 4

hgoebl
hgoebl

Reputation: 12987

You can calculate the size of a text this way:

String text = "This is my text";
Paint textPaint = new Paint(Paint.ANTI_ALIAS_FLAG);
textPaint.setTextSize(14.0f);
Rect bounds = new Rect();
textPaint.getTextBounds(text, 0, text.length(), bounds);

bounds.width() // width in pixels
bounds.height() // height in pixels

Based on these values you could break up the text in pieces and insert newline characters.

Upvotes: 0

Wackaloon
Wackaloon

Reputation: 2365

There no ready solution and no such thing as "wrap text by letters in TextView" the only way to do it in a good way is to extend TextView and modify Paint's breakText(String text, boolean measureForwards, float maxWidth, float[] measuredWidth) function.

Also, you can calculate TextView size in pixels, calculate width of one letter in pixels, then find number of letters (X) that will fit in one line and then insert linebreak after each X letters

Upvotes: 1

Servus7
Servus7

Reputation: 348

Maybe this is a solution: https://stackoverflow.com/a/22337074/3472905

I've added the slash as mentioned:

public class WordBreakTransformationMethod extends ReplacementTransformationMethod {
    private static WordBreakTransformationMethod instance;

    private WordBreakTransformationMethod() {}

    public static WordBreakTransformationMethod getInstance() {
        if (instance == null) {
            instance = new WordBreakTransformationMethod();
        }

        return instance;
    }

    private static char[] dash = new char[]{'-', '\u2011'};
    private static char[] space = new char[]{' ', '\u00A0'};
    private static char[] slash = new char[]{'/', '\u2215'};

    private static char[] original = new char[]{dash[0], space[0], slash[0]};
    private static char[] replacement = new char[]{dash[1], space[1], slash[1]};

    @Override
    protected char[] getOriginal() {
        return original;
    }

    @Override
    protected char[] getReplacement() {
        return replacement;
    }
}

Upvotes: 5

megha jagdale
megha jagdale

Reputation: 396

Keep your textview attribute

android:layout_width="wrap_content"
android:layout_height="wrap_content"

Define Your string in string.xml

<string name="Username"> aaaaaaa\/bb\nbb\-ccccc\/d\ndd</string>

Upvotes: 5

suku
suku

Reputation: 10929

I have tested the following code. You can even convert it into a function:

    String specialString = "a/b/-c/d-d";
    String[] specialArray = specialString.split("/");
    String str = "";
    for(int i = 0; i < specialArray.length - 1; i++){
        str = str + specialArray[i] + Character.toString((char) 47);
    }
    str = str + specialArray[specialArray.length - 1];
    specialArray = str.split("-");
    str = "";
    for(int i = 0; i < specialArray.length - 1; i++){
        str = str + specialArray[i] + Character.toString((char) 45);
    }
    str = str + specialArray[specialArray.length - 1];
    textView.setText(str);

Now the text does not escape

Upvotes: -1

Budius
Budius

Reputation: 39836

you probably can use the Lines attribute or its counter-part method setLines(int)

Upvotes: 0

Related Questions