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