Android – 多行的线性布局

我需要一个多行布局,这将performance为水平线性布局,但是当没有足够的空间来放置新的小部件时,它会扩展到下一行,就像文本中的文字一样。 小部件将在运行时添加到那里,并且应该使用wrap_content 。 其实,会有button。

有没有这种行为的小部件? 或者给我一个关于如何自己写这样的布局的build议。

最后它应该是这样的:

多线布局草案

检查评论:这将做的工作

 /* * 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); } 

谢里夫的回答很好,但没有处理可能会有问题的LinearLayout任何一方的额外意见的情况。 我已经更新并清理了代码来处理这种情况:

 /** * 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); }