Skip to content

Commit a261ef6

Browse files
authored
fix: text break strategy - layout calculation - android (#218)
Fixes issue when component height is calculated incorrectly because of text breaking behavior. This PR ensures that breaking strategy used for displaying text and calculating height is consistent. Additionally, starting from now we use `BREAK_STRATEGY_HIGH_QUALITY` which is consistent with default React Native Android behavior [Before](https://github.com/user-attachments/assets/df328108-e2a3-40c8-b8a8-66905662f827) [After](https://github.com/user-attachments/assets/7ff84bc0-22d6-41ad-bf72-61f7642cbf41)
1 parent c4a79f1 commit a261ef6

File tree

2 files changed

+17
-2
lines changed

2 files changed

+17
-2
lines changed

android/src/main/java/com/swmansion/enriched/EnrichedTextInputView.kt

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,7 @@ import android.graphics.BlendMode
77
import android.graphics.BlendModeColorFilter
88
import android.graphics.Color
99
import android.graphics.Rect
10+
import android.graphics.text.LineBreaker
1011
import android.os.Build
1112
import android.text.InputType
1213
import android.text.Spannable
@@ -102,6 +103,10 @@ class EnrichedTextInputView : AppCompatEditText {
102103
gravity = Gravity.TOP or Gravity.START
103104
inputType = InputType.TYPE_CLASS_TEXT or InputType.TYPE_TEXT_FLAG_MULTI_LINE
104105

106+
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.Q) {
107+
breakStrategy = LineBreaker.BREAK_STRATEGY_HIGH_QUALITY
108+
}
109+
105110
setPadding(0, 0, 0, 0)
106111
setBackgroundColor(Color.TRANSPARENT)
107112

android/src/main/java/com/swmansion/enriched/EnrichedTextInputViewLayoutManager.kt

Lines changed: 12 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,7 @@
11
package com.swmansion.enriched
22

3+
import android.graphics.text.LineBreaker
4+
import android.os.Build
35
import android.text.Editable
46
import android.text.StaticLayout
57
import com.facebook.react.bridge.Arguments
@@ -50,12 +52,20 @@ class EnrichedTextInputViewLayoutManager(private val view: EnrichedTextInputView
5052
val paint = view.paint
5153
val textLength = text.length
5254

53-
val staticLayout = StaticLayout.Builder
55+
val builder = StaticLayout.Builder
5456
.obtain(text, 0, textLength, paint, maxWidth.toInt())
5557
.setIncludePad(true)
5658
.setLineSpacing(0f, 1f)
57-
.build()
5859

60+
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.Q) {
61+
builder.setBreakStrategy(LineBreaker.BREAK_STRATEGY_HIGH_QUALITY)
62+
}
63+
64+
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.P) {
65+
builder.setUseLineSpacingFromFallbacks(true)
66+
}
67+
68+
val staticLayout = builder.build()
5969
val heightInSP = PixelUtil.toDIPFromPixel(staticLayout.height.toFloat())
6070
val widthInSP = PixelUtil.toDIPFromPixel(maxWidth)
6171

0 commit comments

Comments
 (0)