Fragment的使用与通信方式小结
2016-04-10 15:32
405 查看
主要对fragment做一个小结,不涉及太多细节,关于生命周期和常用API就不谈了,浓缩才是精华
一.两种加载Fragment到Activity的方式
1.静态的方式:在xml里使用<fragment>,相当于普通组件一样使用,需要指定android:name="com.xx.xxframent"
2.动态的方式:在代码里动态使用fragment,主要是通过getFragmentManager.beginTranstaction.replace(替换的id, xxfragment).commit()
replace()包含add()和remove()两种操作,还有比较重要的hide和show用于相互切换的情况
二.Fragment与Activity的通信
actvitity获取fragment
因为FragmentManager管理着fragment,所以activity里可以getFragmentManager.findFragmentById()获取到指定的fragment
fragment获取actvitity
在fragment里直接getActivity()
三.Fragment与Activity的传值
actvitity向fragment传值:new Bundle(), xxfragment.setArguments(bundle)
fragment向actvitity传值:定义内部回调接口
模拟回退栈使用transaction.addToBackStack(null);,在事务中加到栈就可以了,这样back键可以实现回退效果
下面来一个简单的Fragment与Fragment的交互demo
效果图,一个activity包含两个fragment,通过点击左边fragment的标题,右边的fragment刷新对应得数据显示
主activity布局
主activity代码
左边fragment就包含一个listview,右边fragment包含一个textview
左边fragment代码
右边fragment代码
虽然Fragment和Activity可以通过getActivity与findFragmentByTag或者findFragmentById,进行任何操作,甚至在Fragment里面操作另外的Fragment,但是这种方式不推荐,推荐把事情交给activity分配去处理,而不是Fragment直接操作另一个Fragment
一.两种加载Fragment到Activity的方式
1.静态的方式:在xml里使用<fragment>,相当于普通组件一样使用,需要指定android:name="com.xx.xxframent"
2.动态的方式:在代码里动态使用fragment,主要是通过getFragmentManager.beginTranstaction.replace(替换的id, xxfragment).commit()
replace()包含add()和remove()两种操作,还有比较重要的hide和show用于相互切换的情况
二.Fragment与Activity的通信
actvitity获取fragment
因为FragmentManager管理着fragment,所以activity里可以getFragmentManager.findFragmentById()获取到指定的fragment
fragment获取actvitity
在fragment里直接getActivity()
三.Fragment与Activity的传值
actvitity向fragment传值:new Bundle(), xxfragment.setArguments(bundle)
fragment向actvitity传值:定义内部回调接口
模拟回退栈使用transaction.addToBackStack(null);,在事务中加到栈就可以了,这样back键可以实现回退效果
下面来一个简单的Fragment与Fragment的交互demo
效果图,一个activity包含两个fragment,通过点击左边fragment的标题,右边的fragment刷新对应得数据显示
主activity布局
主activity代码
左边fragment就包含一个listview,右边fragment包含一个textview
左边fragment代码
public class LeftFragment extends android.app.Fragment { private ListView listView; private String []data = new String[] {"习近平访韩", "奥巴马访中", "我是歌手内幕", "牛奶的好处"}; private MyCallback myCallback; @Override public void onAttach(Activity activity) { super.onAttach(activity); //判断 if (!(activity instanceof MyCallback)) { throw new IllegalStateException("没有实现MyCallback接口"); } myCallback = (MyCallback) activity;//把activity当成MyCallback } @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); } @Override public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { View view = inflater.inflate(R.layout.fragment_left, null); listView = (ListView) view.findViewById(R.id.left_lv); listView.setAdapter(new ArrayAdapter<String>(getActivity(), android.R.layout.simple_list_item_1, data)); listView.setOnItemClickListener(new AdapterView.OnItemClickListener() { @Override public void onItemClick(AdapterView<?> adapterView, View view, int i, long l) { myCallback.onSuccess(i);//回调给activity } }); return view; } @Override public void onDetach() { super.onDetach(); myCallback = null;//解除引用 } public interface MyCallback { void onSuccess(int which); } }
右边fragment代码
public class RightFragment extends android.app.Fragment { private TextView textView; private String []data = new String[] {"习近平访韩,达成xx协议", "奥巴马访中,好开心", "我是歌手内幕,真的有内幕吗", "牛奶的好处,牛奶可以美容,牛奶可以"}; @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); } @Override public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { View view = inflater.inflate(R.layout.fragment_right, null); textView = (TextView) view.findViewById(R.id.right_tv); return view; } //处理相互 public void refresh(int which) { textView.setText(data[which]); } }
虽然Fragment和Activity可以通过getActivity与findFragmentByTag或者findFragmentById,进行任何操作,甚至在Fragment里面操作另外的Fragment,但是这种方式不推荐,推荐把事情交给activity分配去处理,而不是Fragment直接操作另一个Fragment
相关文章推荐
- 【UVA11478】Halum (最短路解差分约束)
- 邁向IT專家成功之路的三十則鐵律 鐵律二十五:IT人屈辱之道-十倍奉還
- 第七周
- Sort Colors
- @SuppressWarnings注解
- Move Zeroes
- Linux上安装使用Redis
- 【剑指offer系列】 数组中出现数字超过一半的数字___29
- poj 2528 Mayor's posters
- SQL函数——CASE
- java插入排序(个人总结)
- Java实现数组反转翻转的方法
- 栈的后缀表达式求值
- JavaWeb总结(一)—Servlet
- Quartz使用-入门使用(java定时任务实现)
- 【笔记】Android中Context相关理解
- 南大周志华写的For Potential Students
- 淘宝开放api
- 20145327 《Java程序设计》第六周学习总结
- 团队介绍