android动态设置配置项并随机排布并实现多选

效果如下:


首先布局是这样的,只有一个自定义的控件的FlowLayout

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:paddingBottom="@dimen/activity_vertical_margin"
    android:paddingLeft="@dimen/activity_horizontal_margin"
    android:paddingRight="@dimen/activity_horizontal_margin"
    android:paddingTop="@dimen/activity_vertical_margin"
    tools:context=".MainActivity" >


    <com.example.zza_android_test7.FlowLayout
        android:id="@+id/flow"
        android:layout_width="match_parent"
        android:layout_height="match_parent" >
    </com.example.zza_android_test7.FlowLayout>


</RelativeLayout>
活动页面,实现了两种方法

package com.example.zza_android_test7;

import java.util.ArrayList;
import java.util.List;

import android.app.Activity;
import android.os.Bundle;
import android.view.Menu;
import android.view.View;
import android.view.View.OnClickListener;
import android.view.ViewGroup;
import android.view.ViewGroup.MarginLayoutParams;
import android.widget.CheckBox;
import android.widget.LinearLayout;

import com.example.zza_android_test7.FlowLayout.LayoutParams;

public class MainActivity extends Activity {

	private FlowLayout flow;
	private List<String> dataList;
	private int dip2px;

	@Override
	protected void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		setContentView(R.layout.activity_main);
		dip2px = DensityUtil.dip2px(this, 10);
		getData();
		flow = (FlowLayout) findViewById(R.id.flow);
		// dynamicSetText();
		dynamicSetText2();
	}

	/**
	 * 动态设置配置项
	 */
	@SuppressWarnings("deprecation")
	public void dynamicSetText() {
		/**
		 * 布局中已经有FlowLayout这个控件了,但是这里为什么还要嵌套在CheckBox上再嵌套一层FlowLayout呢?
		 * 因为FlowLayout中子控件是MarginLayoutParams,
		 * 所以不管是FlowLayout再作为子控件还是CheckBox必须是MarginLayoutParams
		 */
		FlowLayout.LayoutParams lp = new FlowLayout.LayoutParams(
				FlowLayout.LayoutParams.WRAP_CONTENT,
				FlowLayout.LayoutParams.WRAP_CONTENT);
		lp.leftMargin = DensityUtil.dip2px(this, 10);
		lp.rightMargin = DensityUtil.dip2px(this, 10);
		lp.topMargin = DensityUtil.dip2px(this, 5);
		lp.bottomMargin = DensityUtil.dip2px(this, 5);

		for (int i = 0; i < dataList.size(); i++) {
			String city = dataList.get(i);
			final CheckBox checkBox = new CheckBox(this);
			checkBox.setLayoutParams(new ViewGroup.LayoutParams(
					// ViewGroup.MarginLayoutParams.WRAP_CONTENT,
					ViewGroup.LayoutParams.WRAP_CONTENT,
					ViewGroup.LayoutParams.WRAP_CONTENT));
			checkBox.setPadding(dip2px, dip2px, dip2px, dip2px);
			checkBox.setBackgroundResource(R.drawable.selector_checkbox);
			checkBox.setButtonDrawable(getResources().getDrawable(
					android.R.color.transparent));
			checkBox.setText(city);
			flow.addView(checkBox, lp);

			// 设置选择后文字颜色变化
			checkBox.setOnClickListener(new OnClickListener() {

				@Override
				public void onClick(View v) {
					// TODO Auto-generated method stub
					if (checkBox.isChecked()) {
						checkBox.setTextColor(getResources().getColor(
								R.color.green));
					} else {
						checkBox.setTextColor(getResources().getColor(
								R.color.black));
					}
				}
			});

		}
	}

	/**
	 * 动态设置配置项
	 */
	@SuppressWarnings("deprecation")
	public void dynamicSetText2() {
		/**
		 * 布局中已经有FlowLayout这个控件了,不需要再在CheckBox上嵌套一层FlowLayout呢,
		 * 因为FlowLayout中子控件是MarginLayoutParams,所以CheckBox也要是MarginLayoutParams
		 */
		for (int i = 0; i < dataList.size(); i++) {
			String city = dataList.get(i);
			final CheckBox checkBox = new CheckBox(this);
			MarginLayoutParams mlp = new MarginLayoutParams(
					MarginLayoutParams.WRAP_CONTENT,
					MarginLayoutParams.WRAP_CONTENT);
			// 设置marginLeft/Right/Top/Bottom
			mlp.setMargins(dip2px, dip2px, dip2px, dip2px);
			checkBox.setLayoutParams(mlp);

			// 设置文字padding
			checkBox.setPadding(dip2px, dip2px, dip2px, dip2px);
			checkBox.setBackgroundResource(R.drawable.selector_checkbox);
			checkBox.setButtonDrawable(getResources().getDrawable(
					android.R.color.transparent));
			checkBox.setText(city);
			flow.addView(checkBox);

			// 设置选择后文字颜色变化
			checkBox.setOnClickListener(new OnClickListener() {

				@Override
				public void onClick(View v) {
					// TODO Auto-generated method stub
					if (checkBox.isChecked()) {
						checkBox.setTextColor(getResources().getColor(
								R.color.green));
					} else {
						checkBox.setTextColor(getResources().getColor(
								R.color.black));
					}
				}
			});

		}
	}

	public List<String> getData() {
		dataList = new ArrayList<String>();
		dataList.add("南京");
		dataList.add("北京");
		dataList.add("连云港");
		dataList.add("青岛");
		dataList.add("丽江");
		dataList.add("漠河");
		dataList.add("重庆");
		return dataList;
	}

	@Override
	public boolean onCreateOptionsMenu(Menu menu) {
		// Inflate the menu; this adds items to the action bar if it is present.
		getMenuInflater().inflate(R.menu.main, menu);
		return true;
	}

}



下载地址

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值