该架构的优势:
1)、每个页面有单独的xml布局文件,降低各个页面之间耦合性,便于各个页面的分开操作。
2)、共用一个activity便于数据传递。
3)、结构清晰。
4)、便于扩展。
结构图:
1、文件清单:
MainActivity:Activity,对应布局文件:activity_main.xml---一个空的FrameLayout,主要作为容器,容纳主页面的内容和侧页面的内容
ContentFragment:主页面Fragment,对应布局文件:fragment_content.xml------包括一个容纳三个主页面内容的PagerView和三个主页面的 首页、购物车和设置的RadioGroup
LeftFragment:侧页面Fragment,对应布局文件:fragment_leftmenu.xml-----侧页面的内容
BaseFragment:以上ContentFragment和LeftFragment的基类,继承自Fragment类
HomePager:home页面,对应布局文件:pager_homepager.xml-----首页的内容
CartPager:cart页面,对应布局文件:pager_cartpager.xml-----购物车的内容
SetPager:set页面,对应布局文件:pager_setpager.xml-----设置的内容
BasePager:以上HomePager、CartPager和SetPager的基类,对应布局文件pager_basepager----以上三个页面都有的侧页面打开按钮、标题、分享按钮以及容纳以上三个页面的FrameLayout
2、详细介绍
2.1、MainActivity.java
public class MainActivity extends SlidingFragmentActivity { @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); requestWindowFeature(Window.FEATURE_NO_TITLE);// 设置主页面没有标题栏 setContentView(R.layout.activity_main); setLeftMenu();// } /* * 使用第三方框架SlidingMenu实现侧滑栏:使用方式:import SlipMenu,然后设置为library,引用即可 */ private void setLeftMenu() { // TODO Auto-generated method stub setBehindContentView(R.layout.fragment_leftmenu_container);// 设置侧滑栏的布局文件,是一个容器 SlidingMenu slidingMenu = getSlidingMenu();// 拿取侧滑栏对象 slidingMenu.setMode(SlidingMenu.LEFT);// 设置侧滑栏的模式为左滑动。(当然可以设置为右滑动、左右一起滑动等) slidingMenu.setTouchModeAbove(SlidingMenu.TOUCHMODE_MARGIN);// 设置手指在屏幕最左边线时滑动才可以划出侧边栏(可以设置为不允许划出、全屏都可以操作等) // 设置渐入渐出效果的值 slidingMenu.setFadeDegree(0.35f); int width = getWindowManager().getDefaultDisplay().getWidth(); slidingMenu.setBehindOffset(width * 2 / 5);// 设置侧边栏划开之后,左边剩下的距离 initFragment(); } // 初始化Fragment private void initFragment() { // TODO Auto-generated method stub FragmentManager fm = getSupportFragmentManager();// 拿取FragmentManager /* * 开启事务,加载需要的“容器加载” */ FragmentTransaction ft = fm.beginTransaction(); ft.replace(R.id.fl_main, new ContentFragment());// 把fl_main的内容替换成ContentFragment里面的内容 ft.replace(R.id.ll_leftmenu_container, new LeftFragment()); ft.commit(); } // 拿取侧边栏对象。该方法供home用 public LeftFragment getLeftFragment() { FragmentManager supportFragmentManager = getSupportFragmentManager(); LeftFragment leftFragment = (LeftFragment) supportFragmentManager .findFragmentById(R.id.ll_leftmenu_container); return leftFragment; } }2.2、BaseFragment.java
/* * 对Framgent进行简单的封装,在此Framgent中: * 1、拿取调用的Activity对象,便于继承的子类进行操作。2、声明两个方法initView() * 和initData()。分别放在onCreateView()和onActivityCreated(),子类可以直接调用,不用再次引用。 */ public abstract class BaseFragment extends Fragment { public Activity mActivity; /* * fragment创建:在fragment创建后,拿到MainActivity对象,抽象为基类,方便后期使用, */ @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); mActivity = getActivity(); } /* * fragmeng加载视图:加载视图也要抽象为基类。子类直接重载initView()即可初始化视图view */ @Override public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { View view = initView(); return view; } /* * 对应activity创建成功:当MainActivity创建成功,初始化主页面数据(子类的数据初始化) */ @Override public void onActivityCreated(Bundle savedInstanceState) { // TODO Auto-generated method stub super.onActivityCreated(savedInstanceState); initData(); } public abstract View initView(); public abstract void initData(); }2.3、ContentFragment.java
public class ContentFragment extends BaseFragment { private static final String TAG = "ContentFragment"; @ViewInject(R.id.vp_content_pager) ViewPager vp_content; @ViewInject(R.id.rg_content) RadioGroup rg_content;// 三个按钮 @ViewInject(R.id.rb_home) RadioButton rb_home; @ViewInject(R.id.rb_cart) RadioButton rb_cart; @ViewInject(R.id.rb_set) RadioButton rb_set; private List<BasePager> pagers;// 三个主页面的临时存放位置,便于生成pagerview /* * 查看基类,可以知道:该视图返回给View onCreateView(LayoutInflater inflater, ViewGroup * container, Bundle savedInstanceState) ,所以可以创建视图 */ @Override public View initView() { // TODO Auto-generated method stub View view = View.inflate(mActivity, R.layout.fragment_content, null); ViewUtils.inject(this, view);// 注入 return view; } @Override public void initData() { // set default btn rg_content.check(R.id.rb_home);// 设置默认显示页面:home页面 rg_content.setOnCheckedChangeListener(new MyOnCheckedChangeListener());// 监听三个按钮 // 初始化三个主页面 initPager(); } /* * 将三个主页面放到PagerView中,禁止滑动事件,与单选的 RadioGroup点击按钮绑定,即可以实现主页面(首页、购物车、设置)的构图。 */ private void initPager() { pagers = new ArrayList<BasePager>(); pagers.add(new HomePager(mActivity));// 详细解释参看HomePager,一下两个页面同理,不再解释 pagers.add(new CartPager(mActivity)); pagers.add(new SetPager(mActivity)); vp_content.setAdapter(new MyPagerAdapter()); pagers.get(0).initData();// 默认加载首页的数据 } /* * 为pagerview构造视图 */ class MyPagerAdapter extends PagerAdapter { @Override public int getCount() { // TODO Auto-generated method stub return pagers.size(); } @Override public boolean isViewFromObject(View arg0, Object arg1) { // TODO Auto-generated method stub return arg0 == arg1; } @Override public Object instantiateItem(ViewGroup container, int position) { BasePager basePager = pagers.get(position); View view = basePager.mView; container.addView(view); return view; } @Override public void destroyItem(ViewGroup container, int position, Object object) { container.removeView((View) object); } } class MyOnCheckedChangeListener implements OnCheckedChangeListener { @Override public void onCheckedChanged(RadioGroup group, int checkedId) { switch (checkedId) { case R.id.rb_home: vp_content.setCurrentItem(0, false); pagers.get(0).initData(); ToastUtils.showMsg(mActivity, "init home data..."); break; case R.id.rb_cart: vp_content.setCurrentItem(1, false); pagers.get(1).initData(); ToastUtils.showMsg(mActivity, "init cart data..."); break; case R.id.rb_set: vp_content.setCurrentItem(2, false); pagers.get(2).initData(); ToastUtils.showMsg(mActivity, "init set data..."); break; default: break; } } } }2.4、LeftFragment.java
public class LeftFragment extends BaseFragment { private static final String TAG = "LeftFragment"; private TextView tv_leftmenu_data; private Button btn_leftmenu_data; @Override public View initView() { View view = View.inflate(mActivity, R.layout.fragment_leftmenu, null); tv_leftmenu_data = (TextView) view.findViewById(R.id.tv_leftmenu_data); btn_leftmenu_data = (Button) view.findViewById(R.id.btn_leftmenu_data); btn_leftmenu_data.setOnClickListener(new OnClickListener() { @Override public void onClick(View v) { // TODO Auto-generated method stub ToastUtils.showMsg(mActivity, "侧页面按钮,点击文字有效!开始传值!"); SetPager.setDatafromLeftFagment(btn_leftmenu_data.getText() .toString()); } }); return view; } @Override public void initData() { // TODO Auto-generated method stub } public void setDataFromHome(String str) { Log.d(TAG, "传值过来了" + str); tv_leftmenu_data.setText(str); } }
/* * 对三个主页面功能的抽取,形成一个BasePager页面:拿取MainActivity。初始化视图:标题栏的布局实现以及全局的事件的设定等 */ public abstract class BasePager { public TextView tv_title;// 标题 public ImageView iv_menu;// 打开侧边栏的按钮 public ImageView iv_share;// 分享按钮 public FrameLayout fl_content;// 主页面内容 public View mView;// view视图:这个视图会在子类中频繁使用 public Activity mActivity;// MainActivity public BasePager(Activity mActivity) { this.mActivity = mActivity; initView(); } public void initView() { this.mView = View.inflate(mActivity, R.layout.pager_basepager, null); tv_title = (TextView) mView.findViewById(R.id.tv_basepager_title); iv_menu = (ImageView) mView.findViewById(R.id.iv_basepager_menu); iv_share = (ImageView) mView.findViewById(R.id.iv_basepager_share); fl_content = (FrameLayout) mView .findViewById(R.id.fl_basepager_content); } public void initData() { iv_menu.setOnClickListener(new OnClickListener() { @Override public void onClick(View v) { // TODO Auto-generated method stub // MainActivity mainActivity = (MainActivity) mActivity; // SlidingMenu slidingMenu = mainActivity.getSlidingMenu(); // slidingMenu.toggle();// 打开或者关闭侧边栏 SlidingMenuUtils.toggle(mActivity);// 抽离成工具类 } }); iv_share.setOnClickListener(new OnClickListener() { @Override public void onClick(View v) { // TODO Auto-generated method stub ToastUtils.showMsg(mActivity, "share me hahha");// 此处调用分享的接口 } }); } }
public class HomePager extends BasePager { private Button btn_home; private static TextView tv_home_temp; public HomePager(Activity mActivity) { super(mActivity); // TODO Auto-generated constructor stub } @Override public void initView() { // TODO Auto-generated method stub super.initView(); tv_title.setText("home"); View view = View.inflate(mActivity, R.layout.pager_homepager, null);// 拿取home对应的布局文件 tv_home_temp = (TextView) view.findViewById(R.id.tv_home_temp); btn_home = (Button) view.findViewById(R.id.btn_home); fl_content.addView(view);// 将拿到的home的布局文件放到fl_content,实现嵌套:既有原有的侧边栏按钮、标题、分享按钮,又可以实现每个页面的单独布局 } @Override public void initData() { super.initData(); btn_home.setOnClickListener(new OnClickListener() { @Override public void onClick(View v) { // TODO Auto-generated method stub MainActivity mainActivity = (MainActivity) mActivity; LeftFragment leftFragment = mainActivity.getLeftFragment(); leftFragment.setDataFromHome(btn_home.getText().toString()); // 传值结束,打开侧边栏 // SlidingMenu slidingMenu = mainActivity.getSlidingMenu(); // slidingMenu.toggle();// 打开或者关闭侧边栏 SlidingMenuUtils.toggle(mActivity); } }); } /* * 接收从cart传过来的临时参数,修改TextView里面的值 */ public static void setDatafromCart(String str) { tv_home_temp.setText(str); } }