首页>代码>国人写的安卓框架AndBase>/AndBase/src/com/ab/activity/AbActivity.java
/*
 * Copyright (C) 2012 www.amsoft.cn
 * 
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 *     http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */
package com.ab.activity;

import java.lang.reflect.Field;

import android.app.Application;
import android.graphics.Color;
import android.os.Bundle;
import android.support.v4.app.FragmentActivity;
import android.text.TextUtils;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.view.Window;
import android.widget.AbsListView;
import android.widget.LinearLayout;
import android.widget.LinearLayout.LayoutParams;
import android.widget.RelativeLayout;

import com.ab.view.ioc.AbIocEventListener;
import com.ab.view.ioc.AbIocSelect;
import com.ab.view.ioc.AbIocView;
import com.ab.view.titlebar.AbBottomBar;
import com.ab.view.titlebar.AbTitleBar;

// TODO: Auto-generated Javadoc
/**
 * © 2012 amsoft.cn
 * 名称:AbActivity.java 
 * 描述:继承这个Activity使你的Activity拥有一个程序框架.
 *
 * @author 还如一梦中
 * @version v1.0
 * @date:2013-1-15 下午3:27:05
 */

public abstract class AbActivity extends FragmentActivity {

	/** 全局的LayoutInflater对象,已经完成初始化. */
	public LayoutInflater mInflater;
	
	/** 全局的Application对象,已经完成初始化. */
	public Application abApplication = null;
	
	/** 总布局. */
	public RelativeLayout ab_base = null;
	
	/** 标题栏布局. */
	private AbTitleBar mAbTitleBar = null;
	
	/** 副标题栏布局. */
	private AbBottomBar mAbBottomBar = null;
	
	/** 主内容布局. */
	protected RelativeLayout contentLayout = null;
	
	/**
	 * 描述:创建.
	 *
	 * @param savedInstanceState the saved instance state
	 * @see android.support.v4.app.FragmentActivity#onCreate(android.os.Bundle)
	 */
	@Override
	protected void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		requestWindowFeature(Window.FEATURE_NO_TITLE);
		mInflater = LayoutInflater.from(this);
		
		//主标题栏
		mAbTitleBar = new AbTitleBar(this);
		
		//最外层布局
		ab_base = new RelativeLayout(this);
		ab_base.setBackgroundColor(Color.rgb(255, 255, 255));
		
		//内容布局
		contentLayout = new RelativeLayout(this);
		contentLayout.setPadding(0, 0, 0, 0);
		
		//副标题栏
		mAbBottomBar = new AbBottomBar(this);
		
        //填入View
		ab_base.addView(mAbTitleBar,new LinearLayout.LayoutParams(LayoutParams.MATCH_PARENT, LayoutParams.WRAP_CONTENT));
		
		mAbTitleBar.setVisibility(View.GONE);
		
		RelativeLayout.LayoutParams layoutParamsBottomBar = new RelativeLayout.LayoutParams(ViewGroup.LayoutParams.FILL_PARENT, ViewGroup.LayoutParams.WRAP_CONTENT);
		layoutParamsBottomBar.addRule(RelativeLayout.ALIGN_PARENT_BOTTOM, RelativeLayout.TRUE);
		ab_base.addView(mAbBottomBar, layoutParamsBottomBar);
		
		RelativeLayout.LayoutParams layoutParamsContent = new RelativeLayout.LayoutParams(ViewGroup.LayoutParams.FILL_PARENT, ViewGroup.LayoutParams.WRAP_CONTENT);
		layoutParamsContent.addRule(RelativeLayout.BELOW, mAbTitleBar.getId());
		layoutParamsContent.addRule(RelativeLayout.ABOVE, mAbBottomBar.getId());
		ab_base.addView(contentLayout, layoutParamsContent);
		
		//Application初始化
		abApplication = getApplication();
        
		//设置ContentView
        setContentView(ab_base,new LinearLayout.LayoutParams(LayoutParams.MATCH_PARENT, LayoutParams.MATCH_PARENT));
	}
	
	/**
	 * 描述:用指定的View填充主界面.
	 * @param contentView  指定的View
	 */
	public void setAbContentView(View contentView) {
		contentLayout.removeAllViews();
		contentLayout.addView(contentView,new LinearLayout.LayoutParams(LayoutParams.MATCH_PARENT, LayoutParams.MATCH_PARENT));
		//ioc
		initIocView();
	}
	
	/**
	 * 描述:用指定资源ID表示的View填充主界面.
	 * @param resId  指定的View的资源ID
	 */
	public void setAbContentView(int resId) {
		setAbContentView(mInflater.inflate(resId, null));
	}
	
	/**
	 * 获取主标题栏布局.
	 * @return the title layout
	 */
	public AbTitleBar getTitleBar() {
		mAbTitleBar.setVisibility(View.VISIBLE);
		return mAbTitleBar;
	}
	
	/**
	 * 获取副标题栏布局.
	 * @return the bottom layout
	 */
	public AbBottomBar getBottomBar() {
		return mAbBottomBar;
	}

	/**
	 * 描述:Activity结束.
	 *
	 * @see android.app.Activity#finish()
	 */
	@Override
	public void finish() {
		super.finish();
	}

	/**
	 * 描述:设置绝对定位的主标题栏覆盖到内容的上边.
	 *
	 * @param overlay the new title bar overlay
	 */
	public void setTitleBarOverlay(boolean overlay) {
		ab_base.removeAllViews();
		if(overlay){
			RelativeLayout.LayoutParams layoutParamsFW1 = new RelativeLayout.LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT, ViewGroup.LayoutParams.WRAP_CONTENT);
			layoutParamsFW1.addRule(RelativeLayout.ABOVE, mAbBottomBar.getId());
			ab_base.addView(contentLayout,layoutParamsFW1);
			RelativeLayout.LayoutParams layoutParamsFW2 = new RelativeLayout.LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT, ViewGroup.LayoutParams.WRAP_CONTENT);
			layoutParamsFW2.addRule(RelativeLayout.ALIGN_PARENT_TOP,RelativeLayout.TRUE);
			ab_base.addView(mAbTitleBar,layoutParamsFW2);
			
			RelativeLayout.LayoutParams layoutParamsFW3 = new RelativeLayout.LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT, ViewGroup.LayoutParams.WRAP_CONTENT);
			layoutParamsFW3.addRule(RelativeLayout.ALIGN_PARENT_BOTTOM, RelativeLayout.TRUE);
			ab_base.addView(mAbBottomBar, layoutParamsFW3);
			
		}else{
			ab_base.addView(mAbTitleBar,new LinearLayout.LayoutParams(LayoutParams.MATCH_PARENT, LayoutParams.WRAP_CONTENT));
			
			RelativeLayout.LayoutParams layoutParamsFW2 = new RelativeLayout.LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT, ViewGroup.LayoutParams.WRAP_CONTENT);
			layoutParamsFW2.addRule(RelativeLayout.ALIGN_PARENT_BOTTOM, RelativeLayout.TRUE);
			ab_base.addView(mAbBottomBar, layoutParamsFW2);
			
			RelativeLayout.LayoutParams layoutParamsFW1 = new RelativeLayout.LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT, ViewGroup.LayoutParams.WRAP_CONTENT);
			layoutParamsFW1.addRule(RelativeLayout.BELOW, mAbTitleBar.getId());
			layoutParamsFW1.addRule(RelativeLayout.ABOVE, mAbBottomBar.getId());
			ab_base.addView(contentLayout, layoutParamsFW1);
		}
	}
	
	/**
	 * 描述:设置界面显示(忽略标题栏).
	 *
	 * @param layoutResID the new content view
	 * @see android.app.Activity#setContentView(int)
	 */
	@Override
	public void setContentView(int layoutResID) {
		super.setContentView(layoutResID);
		initIocView();
	}

	/**
	 * 描述:设置界面显示(忽略标题栏).
	 *
	 * @param view the view
	 * @param params the params
	 * @see android.app.Activity#setContentView(android.view.View, android.view.ViewGroup.LayoutParams)
	 */
	@Override
	public void setContentView(View view,
			android.view.ViewGroup.LayoutParams params) {
		super.setContentView(view, params);
		initIocView();
	}

	/**
	 * 描述:设置界面显示(忽略标题栏).
	 *
	 * @param view the new content view
	 * @see android.app.Activity#setContentView(android.view.View)
	 */
	public void setContentView(View view) {
		super.setContentView(view);
		initIocView();
	}
	
	/**
	 * 初始化为IOC控制的View.
	 */
	private void initIocView(){
		Field[] fields = getClass().getDeclaredFields();
		if(fields!=null && fields.length>0){
			for(Field field : fields){
				try {
					field.setAccessible(true);
					
					if(field.get(this)!= null )
						continue;
				
					AbIocView viewInject = field.getAnnotation(AbIocView.class);
					if(viewInject!=null){
						
						int viewId = viewInject.id();
					    field.set(this,findViewById(viewId));
					
						setListener(field,viewInject.click(),AbIocEventListener.CLICK);
						setListener(field,viewInject.longClick(),AbIocEventListener.LONGCLICK);
						setListener(field,viewInject.itemClick(),AbIocEventListener.ITEMCLICK);
						setListener(field,viewInject.itemLongClick(),AbIocEventListener.ITEMLONGCLICK);
						
						AbIocSelect select = viewInject.select();
						if(!TextUtils.isEmpty(select.selected())){
							setViewSelectListener(field,select.selected(),select.noSelected());
						}
						
					}
				} catch (Exception e) {
					e.printStackTrace();
				}
			}
		}
	}
	
	/**
	 * 设置view的监听器.
	 *
	 * @param field the field
	 * @param select the select
	 * @param noSelect the no select
	 * @throws Exception the exception
	 */
	private void setViewSelectListener(Field field,String select,String noSelect)throws Exception{
		Object obj = field.get(this);
		if(obj instanceof View){
			((AbsListView)obj).setOnItemSelectedListener(new AbIocEventListener(this).select(select).noSelect(noSelect));
		}
	}
	
	/**
	 * 设置view的监听器.
	 *
	 * @param field the field
	 * @param methodName the method name
	 * @param method the method
	 * @throws Exception the exception
	 */
	private void setListener(Field field,String methodName,int method)throws Exception{
		if(methodName == null || methodName.trim().length() == 0)
			return;
		
		Object obj = field.get(this);
		
		switch (method) {
			case AbIocEventListener.CLICK:
				if(obj instanceof View){
					((View)obj).setOnClickListener(new AbIocEventListener(this).click(methodName));
				}
				break;
			case AbIocEventListener.ITEMCLICK:
				if(obj instanceof AbsListView){
					((AbsListView)obj).setOnItemClickListener(new AbIocEventListener(this).itemClick(methodName));
				}
				break;
			case AbIocEventListener.LONGCLICK:
				if(obj instanceof View){
					((View)obj).setOnLongClickListener(new AbIocEventListener(this).longClick(methodName));
				}
				break;
			case AbIocEventListener.ITEMLONGCLICK:
				if(obj instanceof AbsListView){
					((AbsListView)obj).setOnItemLongClickListener(new AbIocEventListener(this).itemLongClick(methodName));
				}
				break;
			default:
				break;
		}
	}
	
}
最近下载更多
652654393  LV5 2024年11月18日
haozhilang  LV9 2023年11月2日
yyyyyyzh  LV8 2023年6月11日
wanfeng_233  LV4 2023年5月29日
sks666  LV5 2023年2月19日
lasherry  LV2 2023年2月14日
快乐的程序员  LV25 2023年1月21日
ABU元帅  LV2 2022年11月7日
787194770  LV10 2022年10月19日
yjycdjb  LV5 2022年5月23日
最近浏览更多
652654393  LV5 2024年11月18日
Silence丶二哈  LV13 2024年9月2日
17693282606  LV12 2024年6月20日
2636804923  LV6 2024年6月20日
lilitu  LV6 2024年5月31日
阿九11111  LV4 2024年5月21日
panwill  LV5 2024年5月15日
13543528515  LV8 2024年4月29日
小yuzhennice 2024年4月27日
暂无贡献等级
syd1988  LV7 2024年3月7日
顶部 客服 微信二维码 底部
>扫描二维码关注最代码为好友扫描二维码关注最代码为好友