[Android] Android中动态添加Panel的框架代码

项目经常会有这种需求,就是想动态的在某个界面上添加一个Panel。比如,有一个按钮,点击后会显示下拉菜单式的界面。这种需求,就属于动态添加一个Panel。需求多了,就要研究是否可以抽象出通用的框架代码,以方便开发,所以就有了以下内容。

这里说是框架,说的大了点,其实没有那么复杂,只是一个容易扩展的基类而已。不过至少算是框架类的代码。

package arui;

import android.app.Activity;
import android.os.Handler;
import android.os.Looper;
import android.os.Message;
import android.view.Gravity;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup.LayoutParams;
import android.view.ViewManager;
import android.widget.FrameLayout;

/**
 * Base class for panel.
 * 
 */
public abstract class BasePanel {

	/**
	 * left up position
	 */
	public static final int LEFT_UP = 1;

	/**
	 * right up position
	 */
	public static final int RIGHT_UP = 2;

	/**
	 * left bottom position
	 */
	public static final int LEFT_BOTTOM = 3;

	/**
	 * right bottom position
	 */
	public static final int RIGHT_BOTTOM = 4;

	private static final int DEFAULT_MARGIN = 10;

	private static final int SHOW_PANEL = 0;

	private Activity activity;

	private LayoutParams parameters;

	private View view = null;

	private int layoutId;

	/**
	 * constructor.
	 * 
	 * @param activity
	 *            this panel will be attached to the activity
	 * @param layoutId
	 *            the panel's layout id
	 */
	public BasePanel(Activity activity, int layoutId) {
		this.activity = activity;
		this.layoutId = layoutId;
	}

	/**
	 * The developer can use this method to add the panel to the Activity.
	 * 
	 * @param act
	 *            Activity
	 * @param params
	 *            LayoutParams
	 */
	public void attach(LayoutParams params) {
		parameters = params;
		mHandler.sendMessage(mHandler.obtainMessage(SHOW_PANEL));

	}

	/**
	 * The developer can use this method to add the panel to the Activity.
	 * 
	 * @param act
	 *            Activity
	 * @param position
	 *            int. You can use BasePanel.LEFT_UP,BasePanel.RIGHT_UP,
	 *            BasePanel.RIGHT_BOTTOM or BasePanel.LEFT_BOTTOM.
	 */
	public void attach(int position) {
		attach(position, DEFAULT_MARGIN, DEFAULT_MARGIN, DEFAULT_MARGIN,
				DEFAULT_MARGIN);
	}

	/**
	 * The developer can use this method to add the panel to the Activity.
	 * 
	 * @param act
	 *            Activity
	 * @param position
	 *            int. You can use BasePanel.LEFT_UP,BasePanel.RIGHT_UP,
	 *            BasePanel.RIGHT_BOTTOM or BasePanel.LEFT_BOTTOM.
	 * @param leftMargin
	 *            int, left margin.
	 * @param topMargin
	 *            int, top margin.
	 * @param rightMargin
	 *            int, right margin.
	 * @param bottomMargin
	 *            int, bottom margin.
	 * 
	 */
	public void attach(int position, int leftMargin, int topMargin,
			int rightMargin, int bottomMargin) {
		FrameLayout.LayoutParams params = null;
		params = new FrameLayout.LayoutParams(LayoutParams.WRAP_CONTENT,
				LayoutParams.WRAP_CONTENT);
		params.setMargins(leftMargin, topMargin, rightMargin, bottomMargin);
		switch (position) {
		case LEFT_UP:
			params.gravity = Gravity.LEFT;
			break;
		case RIGHT_UP:
			params.gravity = Gravity.RIGHT;
			break;
		case LEFT_BOTTOM:
			params.gravity = Gravity.LEFT | Gravity.BOTTOM;
			break;
		case RIGHT_BOTTOM:
			params.gravity = Gravity.RIGHT | Gravity.BOTTOM;
			break;
		default:
			break;
		}
		attach(params);
	}

	/**
	 * The developer can use this method to remove the panel from the Activity.
	 * 
	 */
	public void remove() {
		if (view != null) {
			ViewManager mViewManager = (ViewManager) view.getParent();
			if (mViewManager != null) {
				mViewManager.removeView(view);
			}
		}
	}

	private Handler mHandler = new Handler(Looper.getMainLooper()) {

		@Override
		public void handleMessage(Message msg) {
			switch (msg.what) {
			case SHOW_PANEL:
				if (view == null) {
					LayoutInflater factory = LayoutInflater.from(activity);
					view = factory.inflate(layoutId, null);
				}
				dealwithPanel(view);
				remove();
				activity.addContentView(view, parameters);
				break;
			}
		}

	};

	/**
	 * do something with this panel.
	 * 
	 * @param view
	 *            View of the panel
	 */
	public abstract void dealwithPanel(View view);
}


 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值