Android: - 如何在单词中断android TextView 6.0 OS以下添加连字符" - "

Nit*_*ith 5 android android-layout android-fragments android-studio

我想在TextView中动态显示文本.该文本将动态地来自服务器.这可以是单个单词,也可以是单行或段落.文本根据客户要求显示大小为56sp的视图.

我的问题是,应用程序以巨大的尺寸显示文本.在行尾的单词分隔的情况下,OS不会在Marshmallow设备下面自动显示连字符(" - ").

例如:文本: "现在可用的残留数据"它在UI中显示为

结转

数据现在ava

ilable

我想把它表现为

结转

数据现在ava

ilable.

但这适用于棉花糖或以上设备.

TextView属性如下所示

<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));
Run Code Online (Sandbox Code Playgroud)

Nit*_*ith 3

我实施了另一种方法来解决这个问题。

为了推广所有设备的实现,请根据句子中最长的单词动态排列文本。请使用以下两种方法并使用 TextView 传递完整的句子。这将自动排列所有屏幕上所有设备的文本。

/**
     *
     * @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;
    }
Run Code Online (Sandbox Code Playgroud)