Android:- 如何在 6.0 操作系统以下的分词器 android TextView 中添加连字符 "-"

标签 android android-layout android-studio android-fragments

我想在 TextView 中动态显示文本。文本将动态地来自服务器。这可能是一个单词或一行或一个段落。文本根据客户要求显示大小为 56sp 的 View 。

我的问题是,应用程序以巨大的尺寸显示文本。在行尾出现断字的情况下,操作系统不会在下面的 Marshmallow 设备中自动显示连字符("-")

例如:文本:“结转数据现已可用” 它在 UI 中显示为

结转

现在的数据ava

无法

我想显示为

结转

数据现在可用-

不能。

但这在 Marshmallow 或更高版本的设备上正常工作。

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

最佳答案

我采用了另一种方法来解决这个问题。

为了推广所有设备的实现,根据句子中最长的单词动态排列文本。请使用以下两种方法并传递完整的句子和使用 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;
    }

关于Android:- 如何在 6.0 操作系统以下的分词器 android TextView 中添加连字符 "-",我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40280038/

相关文章:

android - SDK 管理器不会在 Android Studio 中启动

android - SeekBar 从代码中设置线宽和颜色

android - 安全图像存储安卓

java - 如何将文本从一个 Activity 传递到另一个 Activity (android studio)

java - NavigationDrawer fragment 样式/图标

android - 创建像 pinterest 应用程序一样的 GridView

android-layout - Android UI 行为有时会抛出 NullPointerException

Android 基础 - 不同的类文件

android - 资源条目 com.crashlytics.android.build_id 已定义 - Android Studio

android - 如何重构我的代码以支持 java 8 的新功能,例如实例方法的 'method references'?