1. 程式人生 > >android動態設定配置項並隨機排布並實現多選

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;
	}

}



下載地址