This is due to the android:maxWidth attribute. Since the size in width is set to wrap_content , the widget tries to fit the entire text as wide as possible and in your case the width of the widget thus turns out to be more than the specified value maxWidth ="280dp" , therefore it is limited to the value you specified in 280dp .
That is, the calculated width for this text is greater than the specified maximum width and the width for the widget is taken as the maximum allowed, and the place remains because of the transfer by whole words, and not syllables.
To solve this issue the way you want (the limit on the size of the occupied place at the place of transfer, if the transfer is closer to the current size) is impossible for a standard widget.
I note that for proportional division of the screen it is better to use weights ( android:layout_weight ) since specifying the hardcore width in terms of density will lead to the fact that on different devices the marking will not look the same due to the fact that different screens have different densities - on the screen hdpi it will be almost the entire width, and on xxhdpi a little more than half.