Android - multi-linear linear layout

I need a multi-line layout that will behave like a horizontal linear layout, but when there is not enough space to place a new widget, it will expand to the next line, like words in the text. Widgets will be added there at runtime and should come with wrap_content . Actually there would be buttons.

Are there any widgets with this behavior? Or give a suggestion on how to write such a layout yourself.

Finally, it should look like this:

draft for a multi-line layout

+44
android android-layout
Aug 09 '11 at 13:21
source share
2 answers

Check comments: this will complete the task

 /* * Copyright 2011 Sherif */ private void populateText(LinearLayout ll, View[] views , Context mContext) { Display display = getWindowManager().getDefaultDisplay(); ll.removeAllViews(); int maxWidth = display.getWidth() - 20; LinearLayout.LayoutParams params; LinearLayout newLL = new LinearLayout(mContext); newLL.setLayoutParams(new LayoutParams(LayoutParams.FILL_PARENT, LayoutParams.WRAP_CONTENT)); newLL.setGravity(Gravity.LEFT); newLL.setOrientation(LinearLayout.HORIZONTAL); int widthSoFar = 0; for (int i = 0 ; i < views.length ; i++ ){ LinearLayout LL = new LinearLayout(mContext); LL.setOrientation(LinearLayout.HORIZONTAL); LL.setGravity(Gravity.CENTER_HORIZONTAL|Gravity.BOTTOM); LL.setLayoutParams(new ListView.LayoutParams( LayoutParams.WRAP_CONTENT, LayoutParams.WRAP_CONTENT)); //my old code //TV = new TextView(mContext); //TV.setText(textArray[i]); //TV.setTextSize(size); <<<< SET TEXT SIZE //TV.measure(0, 0); views[i].measure(0,0); params = new LinearLayout.LayoutParams(views[i].getMeasuredWidth(), LayoutParams.WRAP_CONTENT); //params.setMargins(5, 0, 5, 0); // YOU CAN USE THIS //LL.addView(TV, params); LL.addView(views[i], params); LL.measure(0, 0); widthSoFar += views[i].getMeasuredWidth();// YOU MAY NEED TO ADD THE MARGINS if (widthSoFar >= maxWidth) { ll.addView(newLL); newLL = new LinearLayout(mContext); newLL.setLayoutParams(new LayoutParams( LayoutParams.FILL_PARENT, LayoutParams.WRAP_CONTENT)); newLL.setOrientation(LinearLayout.HORIZONTAL); newLL.setGravity(Gravity.LEFT); params = new LinearLayout.LayoutParams(LL .getMeasuredWidth(), LL.getMeasuredHeight()); newLL.addView(LL, params); widthSoFar = LL.getMeasuredWidth(); } else { newLL.addView(LL); } } ll.addView(newLL); } 
+21
Aug 09 2018-11-11T00:
source share

Sherif's answer was good, but could not cope with a situation where there may be additional looks on either side of LinearLayout. I updated and cleared the code to handle this case:

 /** * Copyright 2011 Sherif * Updated by Karim Varela to handle LinearLayouts with other views on either side. * @param linearLayout * @param views : The views to wrap within LinearLayout * @param context * @param extraView : An extra view that may be to the right or left of your LinearLayout. * @author Karim Varela **/ private void populateViews(LinearLayout linearLayout, View[] views, Context context, View extraView) { extraView.measure(LayoutParams.WRAP_CONTENT, LayoutParams.WRAP_CONTENT); // kv : May need to replace 'getSherlockActivity()' with 'this' or 'getActivity()' Display display = getSherlockActivity().getWindowManager().getDefaultDisplay(); linearLayout.removeAllViews(); int maxWidth = display.getWidth() - extraView.getMeasuredWidth() - 20; linearLayout.setOrientation(LinearLayout.VERTICAL); LinearLayout.LayoutParams params; LinearLayout newLL = new LinearLayout(context); newLL.setLayoutParams(new LayoutParams(LayoutParams.FILL_PARENT, LayoutParams.WRAP_CONTENT)); newLL.setGravity(Gravity.LEFT); newLL.setOrientation(LinearLayout.HORIZONTAL); int widthSoFar = 0; for (int i = 0; i < views.length; i++) { LinearLayout LL = new LinearLayout(context); LL.setOrientation(LinearLayout.HORIZONTAL); LL.setGravity(Gravity.CENTER_HORIZONTAL | Gravity.BOTTOM); LL.setLayoutParams(new ListView.LayoutParams(LayoutParams.WRAP_CONTENT, LayoutParams.WRAP_CONTENT)); views[i].measure(0, 0); params = new LinearLayout.LayoutParams(views[i].getMeasuredWidth(), LayoutParams.WRAP_CONTENT); params.setMargins(5, 0, 5, 0); LL.addView(views[i], params); LL.measure(0, 0); widthSoFar += views[i].getMeasuredWidth(); if (widthSoFar >= maxWidth) { linearLayout.addView(newLL); newLL = new LinearLayout(context); newLL.setLayoutParams(new LayoutParams(LayoutParams.FILL_PARENT, LayoutParams.WRAP_CONTENT)); newLL.setOrientation(LinearLayout.HORIZONTAL); newLL.setGravity(Gravity.LEFT); params = new LinearLayout.LayoutParams(LL.getMeasuredWidth(), LL.getMeasuredHeight()); newLL.addView(LL, params); widthSoFar = LL.getMeasuredWidth(); } else { newLL.addView(LL); } } linearLayout.addView(newLL); } 

+17
Nov 22 '12 at 2:19
source share



All Articles