Hyphens are not added at line endings to join words in some languages
Hyphens are only added to connect words in line breaks if the language is set to English. This is probably a bug. Source: https://issuetracker.google.com/issues/37087785 https://issuetracker.google.com/issues/37010641 https://issuetracker.google.com/issues/79936443
Android:- How to add Hyphen - in word break android TextView below 6.0 OS
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;
}
Jetpack Compose Text Hyphenation
You can override the default configuration of the hyphenation configuration (Hyphens = Hyphens.None
) using:
Text(
text = "Korrespondenz\u00ADsprache",
style = MaterialTheme.typography.h4.copy(hyphens = Hyphens.Auto)
)
With Auto
the words will be automatically broken at appropriate hyphenation points.
It requires 1.3.0-rc01
Jetpack Compose Text Hyphenation
You can override the default configuration of the hyphenation configuration (Hyphens = Hyphens.None
) using:
Text(
text = "Korrespondenz\u00ADsprache",
style = MaterialTheme.typography.h4.copy(hyphens = Hyphens.Auto)
)
With Auto
the words will be automatically broken at appropriate hyphenation points.
It requires 1.3.0-rc01
Related Topics
Calling Camera from an Activity, Capturing an Image and Uploading to a Server
How to Forward My Localhost Ip-Address to an Android Emulator
Camera Preview Stretched on Few Android Devices
Google Analytics Blocks Android App
Android: Choose Default Launcher Programmatically
Findbugs Idea - Classnotfoundexception Com.Google.Wireless.Android.Sdk.Stats.Intellijindexingstats
How to Find Android Textview Number of Characters Per Line
How to Deal with Deprecated Classes in Android to Keep Compatibility
How to Get Pid of Android Application Without Using Adb Shell
How to Make Part of The Text Bold in Android at Runtime
How to Prevent Nfc Tag Cloning
Isvalidfragment Android API 19
Multiple Notifications to The Same Activity
Firebase Android Onauthstatechanged Called Twice
Android - How to Set Background Color of All Screens
Android Device Phone Call Ability