Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Android:- How to add Hyphen "-" in word break android TextView below 6.0 OS

I want to show text dynamically in a TextView. The text will come from the server dynamically. This may be a single word or a single line or a paragraph. The text is displaying the view with size as 56sp based on customer requirement.

My issue here is, the application displaying the text in a huge size. In the case of word break at the end of the line, OS is not showing a hyphen("-") automatically in below Marshmallow devices.

eg: Text: "Carryover data now available" It's showing in the UI as

Carryover

data now ava

ilable

I want to show this as

Carryover

data now ava-

ilable.

But this is properly working in Marshmallow or above devices.

TextView property is given below

<TextView
     android:id="@+id/tv_primary_headline"
     android:layout_width="match_parent"
     android:layout_height="wrap_content"
     android:layout_alignParentTop="true"
     android:fontFamily="sans-serif-black"
                  android:lineSpacingExtra="@dimen/promo_primarytext_line_spacing"
     android:textAppearance="?android:attr/textAppearanceLarge"
     android:textColor="@color/navigation_selection_color"
     android:textSize="@dimen/promo_primary_headline_size"
     android:textStyle="bold"
     android:visibility="visible" />

 TextView mTvPrimaryHeadline = (TextView) view.
                    findViewById(R.id.tv_primary_headline);
  this.mTvPrimaryHeadline.setText(Html.fromHtml(title));
like image 996
Nithinjith Avatar asked Oct 27 '16 08:10

Nithinjith


People also ask

How do you hyphenate text?

Click inside a text box, then select the Text Box Tools tab, and then click Hyphenation.

How do I add a newline to a TextView in Android?

Just add a \n to your text. This can be done directly in your layout file, or in a string resource and will cleanly break the text in your TextView to the next line.

How do you get 3 dots at the end of a TextView text?

You are applying to your TextView a compound Drawable on the right.. to make the three dots appear in this scenario, you have to apply a android:drawablePadding="{something}dp" attribute to the TextView as well. Hope it helps!


1 Answers

I implement an alternate way to fix this issue.

To generalize the implementation for all devices, dynamically arrange the text based on the longest word in the sentence. Please use the below two methods and pass the complete sentence and using TextView. This will automatically arrange the text for all the devices for all screens.

/**
     *
     * @param message - Raw Header message from Server - Sentance/ Paragraph.
     *              The message will split and rearrange the size based on its character length
     */
    private void updateText(String message, TextView mTvMessageText ) {
        try {
            if (message == null || message.length() == 0) {
                return;
            }

            String word = getLongestWordLength(message);

            if (word == null) {
                return;
            }
            String wordUpper = word.toUpperCase();// Convert the word to uppercase to find the Maximum Space
            // mTvMessageText - TextView need to Update the Value
            float width = ((mTvMessageText.getMeasuredWidth()) - 120); // Get the width of the View with reduced padding
            float textWidth = mTvMessageText.getPaint().measureText(wordUpper); // Get the word Holding Space through Paint
            float textSizeInPixel = getResources().getDimension(R.dimen.message_size); // Get dimension text Size - My Size is 65sp
            float lineSpacingExtra = getResources().getDimension(R.dimen.message_line_spacing); //High text size required Negative Line Spacing initially -15

            /**
             * Loop will reduce the font size of actual 3% in each looping
             * The looping condition is the longest word in the sentence to hold in a single line of View
             * Reduce the Inline space with accordingly
             * Submit the reduced amount of size in the textView and check the holding pixels
             * If the holding pixels are up above the total pixel size, the loop will continue
             */
            while (textWidth > width) {
                textSizeInPixel -= textSizeInPixel * (0.03); // Reduce the Fount Size with 3% each looping
                lineSpacingExtra += Math.abs(lineSpacingExtra) * (0.06); // Reduce the minus space extra
                this.mTvMessageText.setTextSize(TypedValue.COMPLEX_UNIT_PX, textSizeInPixel);
                this.mTvMessageText.setLineSpacing(lineSpacingExtra, 1f);
                textWidth = mTvMessageText.getPaint().measureText(wordUpper);// Assign value to measure the text Size
            }

            /**
             * M & N devices has a property to rearrange the word with hyphenation
             * In Order to avoid the same, Application will add this logic
             */
            if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
                mTvMessageText.setHyphenationFrequency(Layout.HYPHENATION_FREQUENCY_NONE);
            }

            /**
             * Text Set Using from Html
             */

            if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N) {
                this.mTvMessageText.setText(Html.fromHtml(message, Html.FROM_HTML_MODE_LEGACY));
            } else {
                this.mTvMessageText.setText(Html.fromHtml(message));
            }
        } catch (Resources.NotFoundException e) {
            Log.e(TAG, e.getMessage());
        }

    }


    /**
     *
     * @param wordString - Raw String with Multiple word
     *                   This may be a header
     *                   May be a paragraph
     *                   May be contain Multiple Paragraphs
     * @return - Identify the Longest word and return the length of it
     */
    private String getLongestWordLength(String wordString) {
        try {
            if (wordString == null) {
                return null;
            }
            if (wordString.length() == 0) {
                return null;
            }
            String[] splitArray = wordString.split(" ");

            String word = "";

            for (int i = 0; i < splitArray.length; i++) {
                if (splitArray[i].length() > word.length()) {
                    word = splitArray[i];
                }
            }
            return word;
        } catch (Exception e) {
            Log.e(TAG, e.getMessage());
        }
        return null;
    }
like image 174
Nithinjith Avatar answered Oct 12 '22 23:10

Nithinjith