Fragment
来源:互联网 发布:saga淘宝 编辑:程序博客网 时间:2024/06/09 19:52
Fragment 翻译为“片段”。像是Activity的一部分,使用也和activity类似,有自己的布局文件,生命周期。典型应用在大屏幕设备上,左边一个fragment展示联系人列表,右边一个fragment展示对话框,好处是可以随意切换联系人进行聊天。还有就是手机这种小屏幕上,点击下面的导航栏按钮,展示不同的板块内容,其实切换的是不同的fragment,而不是activity。
如何使用:
1. 创建fragment的布局文件
2. 创建fragment类,继承fragment,重写onCreateView方法,用inflate方法加载布局文件。
public class FragmentTest extends Fragment{@Override public View onCreateView(LayoutInflater inflater, ViewGroup container,Bundle savedInstanceState) { return inflater.inflate(R.layout.fragment_layout, container, false); } }
3. 在Activity布局文件中用<fragment android:name = "包名.fragment类名" />标签,将fragment放入activity
这样fragment就放到activity中了,所有fragment中控件的逻辑都应放到fragment类中。Activity只是一个展示的作用。
动态改变Fragment:
在Activity布局文件中写死了<fragment>, 这种方式会固定显示在那里。如何做到点击不同的按钮来切换不同的Fragment呢?
1. 在Activity布局文件中放一个空的FrameLayout标签,这里边用于动态存放Fragment.
2. 监听事件:
public class MainActivity extends AppCompatActivity { private TextView t1; private TextView t2; private FragmentManager fmanager; private NewsFragment nfrag; private FindFragment ffrag; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); t1 = (TextView) findViewById(R.id.t1); t2 = (TextView) findViewById(R.id.t2); //监听两个TextView控件 t1.setOnClickListener(new NavigatListener()); t2.setOnClickListener(new NavigatListener()); nfrag = new NewsFragment(); ffrag = new FindFragment(); //设置默认显示的fragment fmanager = getFragmentManager();//获得一个FragmentManager对象 FragmentTransaction ftransaction = fmanager.beginTransaction();//开始一个事务并返回该事务对象 ftransaction.replace(R.id.main_framlayout,nfrag);//将制定容器组建放入指定Fragment ftransaction.commit();//提交该事务 } //定义监听器 class NavigatListener implements View.OnClickListener { @Override public void onClick(View v) { FragmentTransaction ft =fmanager.beginTransaction(); switch (v.getId()){ case R.id.t1: ft.replace(R.id.main_framlayout, nfrag); break; case R.id.t2: ft.replace(R.id.main_framlayout, ffrag); break; } ft.commit(); } }}
常用方法:
第一步获取FragmentManager对象:getFragmentManager();
第二步获取FragmentTransaction对象:beginTransaction();
FragmentTransaction常用方法:
add()
往Activity中添加一个Fragment
remove()
从Activity中移除一个Fragment,如果被移除的Fragment没有添加到回退栈(回退栈后面会详细说),这个Fragment实例将会被销毁。
replace()
使用另一个Fragment替换当前的,实际上就是remove()然后add()的合体~
hide()
隐藏当前的Fragment,仅仅是设为不可见,并不会销毁
show()
显示之前隐藏的Fragment
detach()
会将view从UI中移除,和remove()不同,此时fragment的状态依然由FragmentManager维护。
attach()
重建view视图,附加到UI上并显示。
transatcion.commit()
提交一个事务
注意:
android.v4 和android.app下都有FragmentManager区别是v4是为了向下兼容,支持低版本,app包是支持安卓3.0以上版本
一个FragmentTrasaction对象只能commit一次;
fragment生命周期方法是被包含它的activity的FragmentManager所调用,所以都是public的。而activity的生命周期方法是操作系统调用,都是protected的.
FragmentManager.add()方法调用时,会调用Fragment实例的onAttach(),onCreate(),onCreateView()方法
什么是回退栈:
上面的例子代码中并没有应用回退栈,当发生点击事件,FrameLayout从一个Fragment切换到另一个Fragment后点击后退,会直接退出Activity.
如果在切换第二个Fragment之前把事务添加到回退栈中,再切换到第二个Fragment,此时我们再点击后退按钮,并不会直接退出Activity,而是回到第一个Fragment。相当于一次弹栈。方法:FragmentTransaction.addToBackStack(null);
- Fragment
- Fragment
- fragment
- Fragment
- Fragment
- Fragment
- Fragment
- fragment
- fragment
- Fragment
- Fragment
- fragment
- Fragment
- Fragment
- Fragment
- Fragment
- Fragment
- fragment
- Linux下查找搜索文件Find命令使用
- UML类图几种关系的总结
- 解决Android studio开发找不到HttpClient问题
- 几种任务调度的 Java 实现方法与比较
- Coco2d-x 内存管理笔记
- Fragment
- Socket Tcp Java
- git仓库删除所有提交历史记录,成为一个干净的新仓库
- 网盘 线上预览(openoffice)
- spark standalone的安装及使用
- centos 网卡绑定
- 【bzoj1224】彩票 dfs
- Android中的闹钟与通知(附Demo)
- MIXER as Reinforcement Learning