Having a TextView
, its width should not go over 1/3 of its parent's width. If its width is smaller than 1/3 of parent, it should have wrap_content
behavior. Its horizontal sibling will always start next to it.
Tried following, it always has hard cut of 1/3 and 2/3, so if the text1 has less space than 1/3 the TextView
two will not start next to it.
change the LinearLayout
to RelativeLayout
, then the android:layout_weight="n"
does not work
basically, need to define width is wrap_content
and the maxWidth
does not go over 1/3.
any suggestion?
<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:orientation="horizontal"
android:weightSum="3">
<TextView
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_weight="1"
android:singleLine="true"
android:ellipsize="end"
/>
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_width="0dp"
android:singleLine="true"
android:ellipsize="end"
android:layout_weight="2"
/>
</LinearLayout>
The solution is simple: Your second Textview's width must be "0dp" like the first one.
<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:orientation="horizontal"
android:weightSum="3">
<TextView
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_weight="1"
android:singleLine="true"
android:ellipsize="end"
/>
<TextView
android:layout_width="0dp"
android:layout_height="wrap_content"
android:singleLine="true"
android:ellipsize="end"
android:layout_weight="2"
/>
</LinearLayout>
basically, need to define width is wrap_content and the maxWidth does not go over 1/3.
If that's all you need, then my suggestion is to scrap the Weight approach and dynamically set the TextView's maxWidth
value.
Something like this:
tv.setMaxWidth(((LinearLayout)tv.getParent()).getWidth()/3);
I think that you'll have to dynamically check the parent layout width every time you update the textView, something like (I have tested this code using a button and edit text to change the textView - works without problem) :
<LinearLayout
android:id="@+id/myLayout"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:orientation="horizontal">
<TextView
android:id="@+id/tvA"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:singleLine="true"
android:ellipsize="end"
/>
<TextView
android:id="@+id/tvB"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:singleLine="true"
android:ellipsize="end"
/>
</LinearLayout>
code:
TextView tvA = (TextView) findViewById(R.id.tvA);
TextView tvB = (TextView) findViewById(R.id.tvB);
LinearLayout myLayout = (LinearLayout) findViewById(R.id.myLayout);
// code to use when the textView is updated
// possibly button onClickListener?
tvA.measure(0, 0);
int textWidth = tvA.getMeasuredWidth();
myLayout.measure(0,0);
int layoutWidth = myLayout.getWidth();
if (textWidth > (layoutWidth / 3)) {
tvA.setLayoutParams(new LinearLayout.LayoutParams(0, LinearLayout.LayoutParams.WRAP_CONTENT, 1.0f));
tvB.setLayoutParams(new LinearLayout.LayoutParams(0, LinearLayout.LayoutParams.WRAP_CONTENT, 2.0f));
} else {
tvA.setLayoutParams(new LinearLayout.LayoutParams(LinearLayout.LayoutParams.WRAP_CONTENT, LinearLayout.LayoutParams.WRAP_CONTENT));
tvB.setLayoutParams(new LinearLayout.LayoutParams(LinearLayout.LayoutParams.WRAP_CONTENT, LinearLayout.LayoutParams.WRAP_CONTENT));
}
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With