Fragment表示“碎片”,它的设计理念是将Activity划分为不同的区块,各区块可以是某个控件,也可以是由Fragment实现显示的部分。
【基本特性】1. 可以在布局中添加某个容器承载Fragment,具体的显示内容由Fragment实现2. Fragment可以被附加到容器中,也可以被其它Fragment替换,也可以被从容器中移除,无论是哪种操作,对于Fragment的宿主Activity及该Activity中其它的部分不会产生影响3. Fragment有独立的生命周期【创建流程】1. 自定义View,继承android.support.v4.app.Fragment2. 重写onCreateView()方法,确定需要显示的内容的View对象,并作为该方法的返回值【使用ViewPager+Fragment】1. 将Activity类修改为继承自FragmentActivity2. 自定义类,继承android.support.v4.app.FragmentPagerAdapter,并重写抽象方法3. 在自定义的FragmentPagerAdapter中定义构造方法时,需要FragmentManager对象,可以通过调用getSupportFragmentManager()方法获取4. 在自定义的FragmentPagerAdapter中的getItem()方法中,根据参数position创建不同的Fragment对象。【注意事项】1. 由于Fragment不是Context的子孙类,在Fragment中需要Context对象时,应该通过调用getActivity()获取其宿主Activity的对象,用于表示上下文对象public class MainActivity extends FragmentActivity { // 按钮:团购 private Button btnMenuDeal; // 按钮:附近 private Button btnMenuNearby; // 按钮:我的 private Button btnMenuMy; // 按钮:更多 private Button btnMenuMore; // Fragment容器 private FrameLayout flContainer; // Fragment的Adapter private FragmentPagerAdapter fragmentAdapter; // 上次显示的Fragment的position,用于显示新Fragment时,把旧的移除 private int lastPosition; // 上次显示的Fragment对象,用于显示新Fragment时,把旧的移除 private Object lastItem; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); // 初始化底部菜单的4个按钮 btnMenuDeal = (Button) findViewById(R.id.btn_menu_deal); btnMenuNearby = (Button) findViewById(R.id.btn_menu_nearby); btnMenuMy = (Button) findViewById(R.id.btn_menu_my); btnMenuMore = (Button) findViewById(R.id.btn_menu_more); // 为底部菜单的4个按钮配置点击监听 MenuButtonOnClickListener listener = new MenuButtonOnClickListener(); btnMenuDeal.setOnClickListener(listener); btnMenuNearby.setOnClickListener(listener); btnMenuMy.setOnClickListener(listener); btnMenuMore.setOnClickListener(listener); // 初始化Fragment容器:FrameLayout flContainer = (FrameLayout) findViewById(R.id.fl_container); // 为Fragment容器配置Adapter(仅当使用ViewPager作为容器时使用) fragmentAdapter = new InnerPagerAdapter(); // flContainer.setAdapter(adapter); // 默认选中第1个 selectMenuItem(btnMenuDeal); // 手动执行监听器,以触发显示第1个Fragment listener.onClick(btnMenuDeal); } private class InnerPagerAdapter extends FragmentPagerAdapter { public InnerPagerAdapter() { super(getSupportFragmentManager()); } @Override public Fragment getItem(int position) { Fragment fragment = null; switch (position) { case 0: fragment = new DealFragment(); break; case 1: fragment = new NearByFragment(); break; case 2: fragment = new MyFragment(); break; case 3: fragment = new MoreFragment(); break; } return fragment; } @Override public int getCount() { return 4; } } /** * Tab菜单点击事件监听器 */ private class MenuButtonOnClickListener implements View.OnClickListener { @Override public void onClick(View v) { int position = 0; switch (v.getId()) { case R.id.btn_menu_deal: position = 0; selectMenuItem(btnMenuDeal); break; case R.id.btn_menu_nearby: position = 1; selectMenuItem(btnMenuNearby); break; case R.id.btn_menu_my: position = 2; selectMenuItem(btnMenuMy); break; case R.id.btn_menu_more: position = 3; selectMenuItem(btnMenuMore); break; } // 如果已经显示了Fragment,则从容器中移除 if(lastItem != null) { fragmentAdapter.destroyItem(flContainer, lastPosition, lastItem); } // 确定当前需要被显示的Fragment对象 Object fragment = fragmentAdapter.instantiateItem(flContainer, position); // 记录下当前显示的Fragment的position lastPosition = position; // 记录下当前显示的Fragment lastItem = fragment; // 设置当前显示的Fragment fragmentAdapter.setPrimaryItem(flContainer, 0, fragment); // 更新显示 fragmentAdapter.finishUpdate(flContainer); } } /** * 选择底部菜单中的某一项 * @param v 被选中的项 */ private void selectMenuItem(View v) { // 实现基本思路是选中1个,取消选中3个 // 具体实现时,可以先取消选中所有,然后选中1个 // 取消选中所有 btnMenuDeal.setSelected(false); btnMenuNearby.setSelected(false); btnMenuMy.setSelected(false); btnMenuMore.setSelected(false); // 选中参数对应的控件 v.setSelected(true); }}
另一种方法实现fragment之间的切换:
@EActivity(resName="main_fragment")public class MainFragmentActivity extends FragmentActivity{ SportFragment sportFragment; DiscoverFragment discoverFragment; MessageFragment messageFragment; MeFragment meFragment; @ViewsById({R.id.btn_main_fragment_sport, R.id.btn_main_fragment_discover, R.id.btn_main_fragment_message, R.id.btn_main_fragment_me}) ArrayList