浅谈Fragment
来源:互联网 发布:python3 socket编程 编辑:程序博客网 时间:2024/05/17 05:57
1.FragmentManager:
FragmentManager能够实现管理activity中fragment. 通过调用activity的getFragmentManager()取得它的实例.(在FragmentActivity中)(getSupportFragmentManager()---使用support -v4包下的fragment)
FragmentManager可以做如下一些事情:
1、使用findFragmentById()(用于在activity layout中提供一个UI的fragment)或findFragmentByTag() (适用于有或没有UI的fragment)获取activity中存在的fragment)
2、将fragment从后台堆栈中弹出, 使用 popBackStack() (模拟用户按下BACK 命令).
3、使用addOnBackStackChangeListener()注册一个监听后台堆栈变化的listener.
2.FragmentTransaction:
FragmentTransaction对fragment进行添加,移除,替换,以及执行其他动作。
从 FragmentManager 获得一个FragmentTransaction的实例 :
FragmentManager fragmentManager =getFragmentManager();
FragmentTransaction fragmentTransaction =fragmentManager.beginTransaction();
每一个事务都是同时要执行的一套变化.可以在一个给定的事务中设置你想执行的所有变化,使用诸如 add(), remove(), 和 replace().然后, 要给activity应用事务, 必须调用 commit().在调用commit()之前, 你可能想调用 addToBackStack(),将事务添加到一个fragment事务的back stack. 这个back stack由activity管理, 并允许用户通过按下 BACK 按键返回到前一个fragment状态.
举个例子, 这里是如何将一个fragment替换为另一个, 并在后台堆栈中保留之前的状态:
// Create new fragment andtransaction Fragment newFragment = new ExampleFragment(); FragmentTransaction transaction =getFragmentManager().beginTransaction(); //Replace whatever is in the fragment_container viewwith this fragment, // and add the transaction to the backstack transaction.replace(R.id.fragment_container,newFragment); transaction.addToBackStack(null); // Commit thetransaction transaction.commit();
在 这个例子中, newFragment 替换了当前layout容器中的由R.id.fragment_container标识的fragment.通过调用 addToBackStack(), replace事务被保存到back stack, 因此用户可以回退事务,并通过按下BACK按键带回前一个fragment.
如果添加多个变化到事务(例如add()或remove())并调用addToBackStack(), 然后在你调用commit()之前的所有应用的变化会被作为一个单个事务添加到后台堆栈, BACK按键会将它们一起回退.
添加变化到 FragmentTransaction的顺序不重要, 除以下例外:
· 必须最后调用 commit().
· 如果添加多个fragment到同一个容器, 那么添加的顺序决定了它们在view hierarchy中显示的顺序.
当 执行一个移除fragment的事务时, 如果没有调用 addToBackStack(), 那么当事务提交后, 那个fragment会被销毁,并且用户不能导航回到它. 有鉴于此, 当移除一个fragment时,如果调用了 addToBackStack(), 那么fragment会被停止, 如果用户导航回来,它将会被恢复.(生命周期方法不会全部执行)
提示: 对于每一个fragment事务, 你可以应用一个事务动画, 通过在提交事务之前调用setTransition()实现.
调用 commit() 并不立即执行事务.恰恰相反, 它将事务安排排期, 一旦准备好, 就在activity的UI线程上运行(主线程).如果有必要, 无论如何, 你可以从你的UI线程调用executePendingTransactions() 来立即执行由commit()提交的事务. 但这么做通常不必要, 除非事务是其他线程中的job的一个从属.
重点: 1.如果不调用.addToBackStack(null)这个方法(把fragment加入栈中),那么每次调用fragment的时候fragment的生命周期方法都会执行,fragment的状态不会保存的。
2.当fragment已经调用add方法加入到栈中的时候再切换显示的时候 :
FragmentTransaction transaction = manager.beginTransaction();
transaction.show(photoFragment).commit();
manager.popBackStack(0, 0);3.当一个fragment已经加入到栈中的时候且现在正在显示的时候,要显示另一个fragment(第一次显示):
transaction = manager.beginTransaction();
transaction.hide(photoFragment).commit();
transaction = manager.beginTransaction();
transaction.add(R.id.body,browserFragment);
transaction.setTransition(FragmentTransaction.TRANSIT_FRAGMENT_OPEN);
transaction.addToBackStack(null);
transaction.commit();
3.activity传递参数给fragment:
activity中设置参数给fragment:
browserFragment = new BrowserFragment();
Bundle args = new Bundle();
InfoSerializable infos = new InfoSerializable();
infos.setList(list);
args.putSerializable("infos", infos);
//Log.i("hj", "position"+position);
args.putInt("position", position);
browserFragment.setArguments(args);
fragment onActivityCreated 方法中接收参数:
@Override
public void onActivityCreated(Bundle savedInstanceState) {
super.onActivityCreated(savedInstanceState);
viewPager = (ViewPager) getView().findViewById(R.id.pager);
Bundle args = getArguments();
InfoSerializable infos = (InfoSerializable) args.getSerializable("infos");
listinfos = infos.getList();
position = args.getInt("position");
}
4.viewpager+fragment:
1.activity继承FragmentActivity
IAskFragmentAdapter fragmentAdapter = new IAskFragmentAdapter(getSupportFragmentManager());
pager.setAdapter(fragmentAdapter);
pager.setOnPageChangeListener(changeListener);
2.adapter继承 FragmentPagerAdapter:
public class IAskFragmentAdapter extends FragmentPagerAdapter {
public IAskFragmentAdapter(FragmentManager fm) {
super(fm);
}
/**
* 向外返回当前要显示的fragment
*/
@Override
public Fragment getItem(int position) {
Fragment f = null;
if (position == 0) {
f = new IAskFragment();
} else if (position == 1) {
f = new IAskAnswerFragment();
} else if (position == 2) {
f = new IAskPersonFragment();
}
return f;
}
/**
* 返回一共多少个数量
*/
@Override
public int getCount() {
return 3;
}
@Override
public void destroyItem(ViewGroup container, int position, Object object) {
super.destroyItem(container, position, object);
}
@Override
public Object instantiateItem(ViewGroup container, int position) {
return super.instantiateItem(container, position);
}
- 浅谈Fragment
- 浅谈 Fragment
- 浅谈Fragment
- 浅谈Fragment
- 浅谈Android Fragment
- 浅谈 Fragment 生命周期
- 浅谈 Fragment 生命周期
- 浅谈如何静态创建Fragment
- 浅谈Activity,Fragment模块化封装
- 浅谈ViewPager+Fragment的使用和理解
- android基础学习(一)--浅谈Fragment间跳转
- 浅谈viewpager+fragment缓存问题的优化
- 浅谈Android中的 Fragment、生命周期回调方法 以及使用
- Android基础篇之浅谈Fragment(app包)
- 关于fragment和activty的通信个人的总结浅谈
- Android基础--浅谈Fragment的状态可见与不可见
- Fragment
- Fragment
- char* 和char[]的区别
- 第7周项目2 工资发放
- iOS架构设计与分层
- Android Permission访问权限大全
- 实现拖拽删除的TouchListener
- 浅谈Fragment
- 希尔排序的总结2
- MAC Mysql 解决中文乱码
- 什么是Bean
- xib使用
- Permutations
- HDU 2509 反尼姆博弈
- Python学习笔记7:函数对象及函数对象作参数
- linux source命令