I am in the process of building my first Android app and running into a weird problem where text wrapping doesn't seem to work as one would expect. The XML layout is a RelativeLayout
because it's a list item template for a RecyclerView
. Inside the row template there are three TextView
objects - the intention is the first two are on one line and the third is on a separate line. Here is the XML structure:
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout
xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="wrap_content"
android:layout_height="wrap_content">
<!-- should be ~85% of view -->
<LinearLayout
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="horizontal"
android:layout_margin="6dp"
android:background="@drawable/list_item_border"
android:padding="6dp">
<LinearLayout
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:orientation="vertical">
<!-- this text should wrap when the content is too big, but it
only does if I set a maxWidth which feels hacky since that
isn't a great multi-device solution -->
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:id="@+id/txDisplayName"
tools:text="** I should wrap when I hit the max available space within my container **"
android:textStyle="bold"
android:elegantTextHeight="true"
android:singleLine="false"
android:minLines="1"
android:maxLines="99"
android:lines="3"
android:textSize="16sp" />
<!-- secondary item on this "row" - should always be below the TextView above -->
<TextView
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:id="@+id/txSKU"
android:textStyle="italic"
android:textSize="18dp"
tools:text="00000-0000-00" />
</LinearLayout>
<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:orientation="horizontal"
android:minWidth="30sp"
android:gravity="right">
<!-- should be ~15% of total view -->
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:gravity="right"
android:textSize="18dp"
android:id="@+id/tvReceivingSummary"
tools:text="00/00" />
</LinearLayout>
</LinearLayout>
</RelativeLayout>
For reference, the @drawable/list_item_border
just adds a small border around the entire row. It's defined as:
<shape xmlns:android="http://schemas.android.com/apk/res/android">
<stroke
android:width="2dp"
android:color="@color/prx_blue" />
<corners android:radius="2dp" />
</shape>
The end goal is something like this (full screen width):
==================================================================
| Potentially long text that should always wrap when | 00/00 |
| the text gets too long. The values come from an | |
| API so it's not controllable text (meaning I can't | |
| easily add "\n" because I wouldn't know where to | |
| separate it out. | |
==================================================================
| This is the second row - no need to wrap |
==================================================================
I've tried various combinations of RelativeLayout
, ConstraintLayout
and TableLayout
, but it seems like I can either get text to wrap (but overlap itself), or I can get it to
not overlap, but it doesn't wrap and pushes the 00/00
off the view so it's not visible.
Any suggestions? I know I have to be close and have looked at multiple SO posts, but being new to this I'm kind of spinning my wheels at this point and hoping someone can assist.