Android笔记之 自定义程序view写法

最近做了一个模拟menu的东西,但是不好用xml文件写and获取,所以导师教我写了个纯java的view


正是开始啦:

自己写一个menu  不外乎一个menu子项,一个行包装,一个外框包装(这里的包装是指一个layout)

现在写的这个,是可以动态添加的,通过调用函数就可以直接构造一个菜单

(我这里没写菜单按钮的监听,很容易的监听)

子项的代码如下:

		/**
		 * 获取一个menu的item
		 * 
		 * @param text
		 * @param clickListener
		 * @param drawable
		 * @return
		 */
		private TextView getChildTextView(String text,
				OnClickListener clickListener, int DrawableId) {
			TextView view = new TextView(mContext);
			LinearLayout.LayoutParams params = new LinearLayout.LayoutParams(
					LinearLayout.LayoutParams.WRAP_CONTENT,
					LinearLayout.LayoutParams.WRAP_CONTENT, 1);

			params.setMargins(3, 3, 3, 3);// 这里是像素px
			view.setLayoutParams(params);
			view.setCompoundDrawablesWithIntrinsicBounds(0, DrawableId, 0, 0);// 这个是设置textview顶部的图片
			view.setText(text);
			view.setGravity(Gravity.CENTER);
			view.setPadding(2, 2, 2, 2);
			view.setOnClickListener(clickListener);
			return view;
		}
说明如下:
LinearLayout.LayoutParams params = new LinearLayout.LayoutParams(
					LinearLayout.LayoutParams.WRAP_CONTENT,
					LinearLayout.LayoutParams.WRAP_CONTENT, 1);





这一句是专门用来配置属性的,参数分别是宽度,高度,权重  这里重点是权重,也就是layout_weight=“1”这个属性的设置

使用 

view.setLayoutParams(params);方法绑定这个配置,
setCompoundDrawablesWithIntrinsicBounds()这个是设置textview上下左右的图标




子项就到这了。

下面是获取一行的layout:

		/**
		 * 获取一行menu
		 * 
		 * @param hashMaps
		 * @return
		 */
		private LinearLayout getChildLayout(
				ArrayList<HashMap<String, Object>> hashMaps) {
			final LinearLayout myLayout = new LinearLayout(mContext);
			myLayout.setLayoutParams(new LayoutParams(
					LinearLayout.LayoutParams.FILL_PARENT,
					LinearLayout.LayoutParams.WRAP_CONTENT));
			myLayout.setOrientation(LinearLayout.HORIZONTAL);

			for (int i = 0; i < hashMaps.size(); i++) {
				String Name = (String) hashMaps.get(i).get("Name");
				int DrawableId = (Integer) hashMaps.get(i).get("DrawableId");
				OnClickListener clickListener = (OnClickListener) hashMaps.get(
						i).get("OnClickListener");
				myLayout.addView(getChildTextView(Name, clickListener,
						DrawableId));
			}

			return myLayout;
		}


我的原理是 每一行都用一个arraylist容器来装,里面放置HashMap<String, Object>

作为一个小的子项

Linearlayout要设置一个重要属性:

myLayout.setOrientation(LinearLayout.HORIZONTAL);

也就是水平排列


外包装如下:

		/**
		 * 第一层
		 * 
		 * @return
		 */
		private LinearLayout getMainLayout() {
			final LinearLayout mainLayout = new LinearLayout(mContext);
			// mainLayout.setId(1111);

			RelativeLayout.LayoutParams params = new RelativeLayout.LayoutParams(
					RelativeLayout.LayoutParams.FILL_PARENT,
					RelativeLayout.LayoutParams.WRAP_CONTENT);
			params.addRule(RelativeLayout.ALIGN_PARENT_BOTTOM,
					RelativeLayout.TRUE);
			mainLayout.setLayoutParams(params);
			// mainLayout.setLayoutParams(null);
			mainLayout.setOrientation(LinearLayout.VERTICAL);
			mainLayout.setBackgroundResource(R.drawable.test);
			mainLayout.setGravity(Gravity.CENTER);
			return mainLayout;
		}

和前面一个道理,不解释


外围两个构造菜单的函数如下:

	private ArrayList<ArrayList<HashMap<String, Object>>> getMenuList() {
		ArrayList<ArrayList<HashMap<String, Object>>> myHashMaps = new ArrayList<ArrayList<HashMap<String, Object>>>();

		ArrayList<HashMap<String, Object>> item = new ArrayList<HashMap<String, Object>>();
		item.add(getMenuItem("账号", R.drawable.account, null));
		item.add(getMenuItem("切换用户", R.drawable.account, null));
		item.add(getMenuItem("帮助", R.drawable.logout, null));
		myHashMaps.add(item);
		myHashMaps.add(item);
		return myHashMaps;
	}

	private HashMap<String, Object> getMenuItem(String name, int DrawableId,
			OnClickListener listener) {
		HashMap<String, Object> map = new HashMap<String, Object>();
		map.put("Name", name);
		map.put("DrawableId", DrawableId);
		map.put("OnClickListener", listener);
		return map;


oncreate如下:

	public void onCreate(Bundle savedInstanceState) {

		super.onCreate(savedInstanceState);
		setContentView(R.layout.main);

		ArrayList<ArrayList<HashMap<String, Object>>> arrayList = getMenuList();

		RelativeLayout.LayoutParams params = new RelativeLayout.LayoutParams(
				RelativeLayout.LayoutParams.FILL_PARENT,
				RelativeLayout.LayoutParams.WRAP_CONTENT);
		params.addRule(RelativeLayout.ALIGN_PARENT_BOTTOM);

		RelativeLayout test = (RelativeLayout) findViewById(R.id.test);
		DN_Menu menu = new DN_Menu(this);
		this.addContentView(menu.getMenuLayout(arrayList), params);

全部代码如下:
package com.jmenu;

import java.util.ArrayList;
import java.util.HashMap;

import android.app.Activity;
import android.content.Context;
import android.graphics.drawable.Drawable;
import android.os.Bundle;
import android.view.Gravity;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.LinearLayout;
import android.widget.LinearLayout.LayoutParams;
import android.widget.RelativeLayout;
import android.widget.TextView;

public class JmenuActivity extends Activity {

	@Override
	public void onCreate(Bundle savedInstanceState) {

		super.onCreate(savedInstanceState);
		setContentView(R.layout.main);

		ArrayList<ArrayList<HashMap<String, Object>>> arrayList = getMenuList();

		RelativeLayout.LayoutParams params = new RelativeLayout.LayoutParams(
				RelativeLayout.LayoutParams.FILL_PARENT,
				RelativeLayout.LayoutParams.WRAP_CONTENT);
		params.addRule(RelativeLayout.ALIGN_PARENT_BOTTOM);

		RelativeLayout test = (RelativeLayout) findViewById(R.id.test);
		DN_Menu menu = new DN_Menu(this);
		this.addContentView(menu.getMenuLayout(arrayList), params);

	}

	private ArrayList<ArrayList<HashMap<String, Object>>> getMenuList() {
		ArrayList<ArrayList<HashMap<String, Object>>> myHashMaps = new ArrayList<ArrayList<HashMap<String, Object>>>();

		ArrayList<HashMap<String, Object>> item = new ArrayList<HashMap<String, Object>>();
		item.add(getMenuItem("账号", R.drawable.account, null));
		item.add(getMenuItem("切换用户", R.drawable.account, null));
		item.add(getMenuItem("帮助", R.drawable.logout, null));
		myHashMaps.add(item);
		myHashMaps.add(item);
		return myHashMaps;
	}

	private HashMap<String, Object> getMenuItem(String name, int DrawableId,
			OnClickListener listener) {
		HashMap<String, Object> map = new HashMap<String, Object>();
		map.put("Name", name);
		map.put("DrawableId", DrawableId);
		map.put("OnClickListener", listener);
		return map;
	}

	private class DN_Menu {
		Context mContext;
		RelativeLayout mainLayout;

		ArrayList<ArrayList<HashMap<String, Object>>> myHashMaps;

		public DN_Menu(Context context) {
			mContext = context;
		}

		public RelativeLayout getMenuLayout(
				ArrayList<ArrayList<HashMap<String, Object>>> arrayList) {
			myHashMaps = arrayList;
			LinearLayout mainLinearLayout = getMainLayout();
			for (int i = 0; i < arrayList.size(); i++) {
				mainLinearLayout.addView(getChildLayout(arrayList.get(i)));
			}

			/**
			 * 下面是加上最大的一层
			 */
			final RelativeLayout myLayout = new RelativeLayout(mContext);
			RelativeLayout.LayoutParams params = new RelativeLayout.LayoutParams(
					RelativeLayout.LayoutParams.FILL_PARENT,
					RelativeLayout.LayoutParams.FILL_PARENT);
			myLayout.addView(mainLinearLayout);
			myLayout.setOnClickListener(new OnClickListener() {
				@Override
				public void onClick(View v) {
					myLayout.setVisibility(View.INVISIBLE);
				}
			});

			mainLayout = myLayout;
			return myLayout;
		}

		/**
		 * 获取一行menu
		 * 
		 * @param hashMaps
		 * @return
		 */
		private LinearLayout getChildLayout(
				ArrayList<HashMap<String, Object>> hashMaps) {
			final LinearLayout myLayout = new LinearLayout(mContext);
			myLayout.setLayoutParams(new LayoutParams(
					LinearLayout.LayoutParams.FILL_PARENT,
					LinearLayout.LayoutParams.WRAP_CONTENT));
			myLayout.setOrientation(LinearLayout.HORIZONTAL);

			for (int i = 0; i < hashMaps.size(); i++) {
				String Name = (String) hashMaps.get(i).get("Name");
				int DrawableId = (Integer) hashMaps.get(i).get("DrawableId");
				OnClickListener clickListener = (OnClickListener) hashMaps.get(
						i).get("OnClickListener");
				myLayout.addView(getChildTextView(Name, clickListener,
						DrawableId));
			}

			return myLayout;
		}

		/**
		 * 获取一个menu的item
		 * 
		 * @param text
		 * @param clickListener
		 * @param drawable
		 * @return
		 */
		private TextView getChildTextView(String text,
				OnClickListener clickListener, int DrawableId) {
			TextView view = new TextView(mContext);
			LinearLayout.LayoutParams params = new LinearLayout.LayoutParams(
					LinearLayout.LayoutParams.WRAP_CONTENT,
					LinearLayout.LayoutParams.WRAP_CONTENT, 1);

			params.setMargins(3, 3, 3, 3);// 这里是像素px
			view.setLayoutParams(params);
			view.setCompoundDrawablesWithIntrinsicBounds(0, DrawableId, 0, 0);// 这个是设置textview顶部的图片
			view.setText(text);
			view.setGravity(Gravity.CENTER);
			view.setPadding(2, 2, 2, 2);
			view.setOnClickListener(clickListener);
			return view;
		}

		/**
		 * 第一层
		 * 
		 * @return
		 */
		private LinearLayout getMainLayout() {
			final LinearLayout mainLayout = new LinearLayout(mContext);
			// mainLayout.setId(1111);

			RelativeLayout.LayoutParams params = new RelativeLayout.LayoutParams(
					RelativeLayout.LayoutParams.FILL_PARENT,
					RelativeLayout.LayoutParams.WRAP_CONTENT);
			params.addRule(RelativeLayout.ALIGN_PARENT_BOTTOM,
					RelativeLayout.TRUE);
			mainLayout.setLayoutParams(params);
			// mainLayout.setLayoutParams(null);
			mainLayout.setOrientation(LinearLayout.VERTICAL);
			mainLayout.setBackgroundResource(R.drawable.test);
			mainLayout.setGravity(Gravity.CENTER);
			return mainLayout;
		}
	}
}

 

效果图:

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值