安卓linearLayout动态添加控件

本文介绍了在Android开发中,如何处理LinearLayout控件因数据过多无法自动换行的问题。作者提出了通过嵌套LinearLayout的方式,来动态加载并布局网络请求的数据,虽然这种方法会导致布局文件增加,但能实现控件的平均分布。详细内容包括如何创建每行布局及定制每个控件。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

在安卓中我们需要网络请求的数据加载控件,但是如果控件数目过多,会超过布局显示的范围,因为linearLayout不会自动换行,在一些文章通过重写linearLayout到达效果,而我通过嵌套linearLayout来达到效果,缺点为布局增多。

主布局用水平linearLayout

<span style="white-space:pre">	</span>// 每行控件的的个数
	final static int WEIGHT = 4;
	@Override
	protected void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		setContentView(R.layout.activity_main);
		LinearLayout mainLayout = (LinearLayout) findViewById(R.id.main);
		// 动态添加控件,首先添加第一行布局
		LinearLayout rowLayout = null;
		for (int i = 0; i < 7; i++) {
			if (i % WEIGHT == 0) {
				// LinearLayout不能换行,每4个添加一个布局,并加入到外层布局中
				rowLayout = createImageLayout();
				mainLayout.addView(rowLayout);
			}<pre name="code" class="java"><span style="white-space:pre">			</span>//创建控件,这里用View表示
			View columnLinearLayout = createImage(WEIGHT);
			rowLayout.addView(columnLinearLayout);
		}
	}



创建每一行的布局

// 每4个图片一行
	public LinearLayout createImageLayout() {
		LinearLayout linearLayout = new LinearLayout(this);
		linearLayout.setOrientation(LinearLayout.HORIZONTAL);
		return linearLayout;
	}



创建每一个控件,里面的内容可自己定制
	public View createImage(int weight) {
		LinearLayout linearLayout = new LinearLayout(this);
		linearLayout.setOrientation(LinearLayout.VERTICAL);
		// 获取屏幕宽度
		int W = this.getWindowManager().getDefaultDisplay().getWidth();
		// 根据每行个数设置布局大小
		linearLayout.setLayoutParams(new LayoutParams(W / weight, LayoutParams.WRAP_CONTENT));
		linearLayout.setPadding(5, 5, 5, 5);
		linearLayout.setGravity(Gravity.CENTER);
		// 设置图片大小
		int cricleRadius = W / (weight +2);
		ImageView circleImageView = new ImageView(this);
		circleImageView.setLayoutParams(new LinearLayout.LayoutParams(cricleRadius, cricleRadius));
		Bitmap map = BitmapFactory.decodeResource(this.getResources(), R.drawable.ic_launcher);
		circleImageView.setImageBitmap(map);
		TextView textView = new TextView(this);
		textView.setText("bar");
		textView.setGravity(Gravity.CENTER);
		linearLayout.setTag(textView.getText());
		linearLayout.addView(circleImageView);
		linearLayout.addView(textView);
		return linearLayout;
	}

完整代码

public class MainActivity extends Activity {
	// 每行图片的个数
	final static int WEIGHT = 4;


	@Override
	protected void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		setContentView(R.layout.activity_main);
		LinearLayout mainLayout = (LinearLayout) findViewById(R.id.main);
		// 动态添加圆形图片
		LinearLayout rowLayout = null;
		for (int i = 0; i < 7; i++) {
			if (i % WEIGHT == 0) {
				// LinearLayout不能换行,增加布局完成。
				rowLayout = createImageLayout();
				mainLayout.addView(rowLayout);
			}
			final View columnLinearLayout = createImage(WEIGHT);
			rowLayout.addView(columnLinearLayout);
		}
	}


	// 每4个图片一行
	public LinearLayout createImageLayout() {
		LinearLayout linearLayout = new LinearLayout(this);
		linearLayout.setOrientation(LinearLayout.HORIZONTAL);
		return linearLayout;
	}


	public View createImage(int weight) {
		LinearLayout linearLayout = new LinearLayout(this);
		linearLayout.setOrientation(LinearLayout.VERTICAL);
		// 获取屏幕宽度
		int W = this.getWindowManager().getDefaultDisplay().getWidth();
		// 根据每行个数设置布局大小
		linearLayout.setLayoutParams(new LayoutParams(W / weight, LayoutParams.WRAP_CONTENT));
		linearLayout.setPadding(5, 5, 5, 5);
		linearLayout.setGravity(Gravity.CENTER);
		// 设置图片大小
		int cricleRadius = W / (weight +2);
		ImageView circleImageView = new ImageView(this);
		circleImageView.setLayoutParams(new LinearLayout.LayoutParams(cricleRadius, cricleRadius));
		Bitmap map = BitmapFactory.decodeResource(this.getResources(), R.drawable.ic_launcher);
		circleImageView.setImageBitmap(map);
		TextView textView = new TextView(this);
		textView.setText("bar");
		textView.setGravity(Gravity.CENTER);
		linearLayout.setTag(textView.getText());
		linearLayout.addView(circleImageView);
		linearLayout.addView(textView);
		return linearLayout;
	}
}

效果图



这里在以下代码控制每个控件的大小,布局平均分配,图片weight+2来设置图片的间距和大小,

linearLayout.setLayoutParams(new LayoutParams(W / weight, LayoutParams.WRAP_CONTENT));
int cricleRadius = W / (weight +2);



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值