Fragment(碎片)
2016-03-04 10:59
399 查看
Fragment表示“碎片”,它的设计理念是将Activity划分为不同的区块,各区块可以是某个控件,也可以是由Fragment实现显示的部分。
【基本特性】
1. 可以在布局中添加某个容器承载Fragment,具体的显示内容由Fragment实现
2. Fragment可以被附加到容器中,也可以被其它Fragment替换,也可以被从容器中移除,无论是哪种操作,对于Fragment的宿主Activity及该Activity中其它的部分不会产生影响
3. Fragment有独立的生命周期
【创建流程】
1. 自定义View,继承android.support.v4.app.Fragment
2. 重写onCreateView()方法,确定需要显示的内容的View对象,并作为该方法的返回值
【使用ViewPager+Fragment】
1. 将Activity类修改为继承自FragmentActivity
2. 自定义类,继承android.support.v4.app.FragmentPagerAdapter,并重写抽象方法
3. 在自定义的FragmentPagerAdapter中定义构造方法时,需要FragmentManager对象,可以通过调用getSupportFragmentManager()方法获取
4. 在自定义的FragmentPagerAdapter中的getItem()方法中,根据参数position创建不同的Fragment对象。
【注意事项】
1. 由于Fragment不是Context的子孙类,在Fragment中需要Context对象时,应该通过调用getActivity()获取其宿主Activity的对象,用于表示上下文对象
另一种方法实现fragment之间的切换:
【基本特性】
1. 可以在布局中添加某个容器承载Fragment,具体的显示内容由Fragment实现
2. Fragment可以被附加到容器中,也可以被其它Fragment替换,也可以被从容器中移除,无论是哪种操作,对于Fragment的宿主Activity及该Activity中其它的部分不会产生影响
3. Fragment有独立的生命周期
【创建流程】
1. 自定义View,继承android.support.v4.app.Fragment
2. 重写onCreateView()方法,确定需要显示的内容的View对象,并作为该方法的返回值
【使用ViewPager+Fragment】
1. 将Activity类修改为继承自FragmentActivity
2. 自定义类,继承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_fragmen 3ff0 t_sport, R.id.btn_main_fragment_discover, R.id.btn_main_fragment_message, R.id.btn_main_fragment_me}) ArrayList<Button> btnList=new ArrayList<Button>(); //放四个fragment Fragment[] fragments=new Fragment[4]; /** * 当前显示的是第几个fragment */ int currentFragmentIndex=0; int clickIndex=0; @Override public void onConfigurationChanged(Configuration newConfig) { int orientation= newConfig.orientation; LogUtil.i("屏幕方向", "activity onConfigurationChanged"+orientation); super.onConfigurationChanged(newConfig); } @Override protected void onCreate(Bundle arg0) { // TODO Auto-generated method stub super.onCreate(arg0); try { LogUtil.i("屏幕方向", "activity onCreate"); sportFragment=new SportFragment(); discoverFragment=new DiscoverFragment(); messageFragment=new MessageFragment(); meFragment=new MeFragment(); fragments[0]=sportFragment; fragments[1]=discoverFragment; fragments[2]=messageFragment; fragments[3]=meFragment; FragmentManager manager=this.getSupportFragmentManager(); //Transaction事务 FragmentTransaction transaction=manager.beginTransaction(); //把sportFragment放到linearLayout transaction.add(R.id.fragment_container, sportFragment); transaction.show(sportFragment); //提交 transaction.commit(); } catch (Exception e) { ExceptionUtil.handlerException(e); } } //代码执行顺序 onCreate-->ViewsById-->AfterView @AfterViews public void addListener() { //设置当前按钮的状态 btnList.get(currentFragmentIndex).setSelected(true); MyListener myListener=new MyListener(); for (Button btn:btnList) { btn.setOnClickListener(myListener); } } class MyListener implements OnClickListener { @Override public void onClick(View v) { try { switch (v.getId()) { case R.id.btn_main_fragment_sport: clickIndex=0; break; case R.id.btn_main_fragment_discover: clickIndex=1; break; case R.id.btn_main_fragment_message: clickIndex=2; break; case R.id.btn_main_fragment_me: clickIndex=3; break; } if (clickIndex!=currentFragmentIndex) { //单击别的按钮,显示另外一个fragment Fragment showFragment=fragments[clickIndex]; FragmentTransaction transaction=getSupportFragmentManager().beginTransaction(); if (!showFragment.isAdded()) { //以前没有显示过 transaction.add(R.id.fragment_container, showFragment); } transaction.hide(fragments[currentFragmentIndex]); transaction.show(showFragment); transaction.commit(); btnList.get(currentFragmentIndex).setSelected(false); btnList.get(clickIndex).setSelected(true); currentFragmentIndex=clickIndex; } } catch (Exception e) { ExceptionUtil.handlerException(e); } } } }
相关文章推荐
- Android兼容包Support v4.v7.v13区别与应用场景
- mac 启动 进度条卡在一半处
- 深入浅出nodejs学习记录
- 关于Myeclipse修改默认编码,而content types中update不能更新问题
- spring filter的targetFilterLifecycle作用
- 英语学习
- android 比较靠谱的图片压缩
- IOS 多个UIImageView 加载高清大图时内存管理
- 3714: [PA2014]Kuglarz|贪心|思路题
- 如何给网页css样式起个好名字?
- AndroidStudio怎样导入jar包
- Hello World聚类代码(一)
- 创建ASM磁盘组时报磁盘组名称冲突的错误
- 机器学习——岭回归和LASSO回归
- IT玄幻小说
- 排序算法---直接选择排序算法
- //画虚线
- oracle优化:避免全表扫描
- centos彻底删除mysql以及查看MySQL的安装路径
- JavaScript动态添加文本框