I work on the application to which the user must enter information. It looks like this: goes LinearLayout(horizontal)
and in it TextView
then EditText
then TextView
. Where the user must enter information in the EditText
.
The problem is that when implemented, it looks like this:
|blabla________tatata| | tatata|
That is, if the line does not fit, the line break comes under the 3rd TextView
.
And I need it to look like this:
|blabla________tatata| |tatata |
That is, if the line does not fit, he would throw it to the beginning of a new line.
The second option, I used this implementation of Flow TextView but, as can be seen from the example below, it is more suitable for the picture.
3rd option:
I use FlowLayout, with this implementation, the entire 3rd part jumps to a new line, and I need to jump only that part that does not fit. Help pliz podfissit!
What it looks like:
public class HorizontalFlowLayout extends RelativeLayout { /** * Constructor to use when creating View from code. */ public HorizontalFlowLayout(Context context) { super(context); } /** * Constructor that is called when inflating View from XML. */ public HorizontalFlowLayout(Context context, AttributeSet attrs) { super(context, attrs); } /** * Perform inflation from XML and apply a class-specific base style. */ public HorizontalFlowLayout(Context context, AttributeSet attrs, int defStyle) { super(context, attrs, defStyle); } @Override protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) { // need to call super.onMeasure(...) otherwise get some funny behaviour super.onMeasure(widthMeasureSpec, heightMeasureSpec); final int width = MeasureSpec.getSize(widthMeasureSpec); int height = MeasureSpec.getSize(heightMeasureSpec); // increment the x position as we progress through a line int xpos = getPaddingLeft(); // increment the y position as we progress through the lines int ypos = getPaddingTop(); // the height of the current line int line_height = 0; // go through children // to work out the height required for this view // call to measure size of children not needed I think?! // getting child's measured height/width seems to work okay without it //measureChildren(widthMeasureSpec, heightMeasureSpec); View child; MarginLayoutParams childMarginLayoutParams; int childWidth, childHeight, childMarginLeft, childMarginRight, childMarginTop, childMarginBottom; for (int i = 0; i < getChildCount(); i++) { child = getChildAt(i); if (child.getVisibility() != GONE) { childWidth = child.getMeasuredWidth(); childHeight = child.getMeasuredHeight(); if (child.getLayoutParams() != null && child.getLayoutParams() instanceof MarginLayoutParams) { childMarginLayoutParams = (MarginLayoutParams)child.getLayoutParams(); childMarginLeft = childMarginLayoutParams.leftMargin; childMarginRight = childMarginLayoutParams.rightMargin; childMarginTop = childMarginLayoutParams.topMargin; childMarginBottom = childMarginLayoutParams.bottomMargin; } else { childMarginLeft = 0; childMarginRight = 0; childMarginTop = 0; childMarginBottom = 0; } if (xpos + childMarginLeft + childWidth + childMarginRight + getPaddingRight() > width) { // this child will need to go on a new line xpos = getPaddingLeft(); ypos += line_height; line_height = childMarginTop + childHeight + childMarginBottom; } else { // enough space for this child on the current line line_height = Math.max( line_height, childMarginTop + childHeight + childMarginBottom); } xpos += childMarginLeft + childWidth + childMarginRight; } } ypos += line_height + getPaddingBottom(); if (MeasureSpec.getMode(heightMeasureSpec) == MeasureSpec.UNSPECIFIED) { // set height as measured since there's no height restrictions height = ypos; } else if (MeasureSpec.getMode(heightMeasureSpec) == MeasureSpec.AT_MOST && ypos < height) { // set height as measured since it's less than the maximum allowed height = ypos; } setMeasuredDimension(width, height); } @Override protected void onLayout(boolean changed, int l, int t, int r, int b) { // increment the x position as we progress through a line int xpos = getPaddingLeft(); // increment the y position as we progress through the lines int ypos = getPaddingTop(); // the height of the current line int line_height = 0; View child; MarginLayoutParams childMarginLayoutParams; int childWidth, childHeight, childMarginLeft, childMarginRight, childMarginTop, childMarginBottom; for (int i = 0; i < getChildCount(); i++) { child = getChildAt(i); if (child.getVisibility() != GONE) { childWidth = child.getMeasuredWidth(); childHeight = child.getMeasuredHeight(); if (child.getLayoutParams() != null && child.getLayoutParams() instanceof MarginLayoutParams) { childMarginLayoutParams = (MarginLayoutParams)child.getLayoutParams(); childMarginLeft = childMarginLayoutParams.leftMargin; childMarginRight = childMarginLayoutParams.rightMargin; childMarginTop = childMarginLayoutParams.topMargin; childMarginBottom = childMarginLayoutParams.bottomMargin; } else { childMarginLeft = 0; childMarginRight = 0; childMarginTop = 0; childMarginBottom = 0; } if (xpos + childMarginLeft + childWidth + childMarginRight + getPaddingRight() > r - l) { // this child will need to go on a new line xpos = getPaddingLeft(); ypos += line_height; line_height = childHeight + childMarginTop + childMarginBottom; } else { // enough space for this child on the current line line_height = Math.max( line_height, childMarginTop + childHeight + childMarginBottom); } child.layout( xpos + childMarginLeft, ypos + childMarginTop, xpos + childMarginLeft + childWidth, ypos + childMarginTop + childHeight); xpos += childMarginLeft + childWidth + childMarginRight; } } } }
XML
<com.example.nikolai.app.HorizontalFlowLayout android:id="@+id/recipientsList" android:layout_width="match_parent" android:layout_height="wrap_content" > <TextView android:layout_width="wrap_content" android:layout_height="wrap_content" android:textSize="20dp" android:text="blablabla bla"/> <EditText android:layout_width="wrap_content" android:layout_height="wrap_content" android:textSize="20dp" android:ems="5"/> <TextView android:layout_width="wrap_content" android:layout_height="wrap_content" android:textSize="20dp" android:text="tatata tatat atatat ffd"/> </com.example.nikolai.app.HorizontalFlowLayout>