主要对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代码
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