android fragment
参考
鸿洋_鸿洋_ Android Fragment 真正的完全解析(下)
鸿洋_ Android Fragment 你应该知道的一切
生命周期
-
- 注意:除了onCreateView,其他的所有方法如果重写了,必须调用父类对于该方法的实现
- onAttach(Activity)
当Fragment与Activity发生关联时调用。
- onCreateView(LayoutInflater, ViewGroup,Bundle)
创建该Fragment的视图
- onActivityCreated(Bundle)
当Activity的onCreate方法返回时调用
- onDestoryView()
与onCreateView想对应,当该Fragment的视图被移除时调用
- onDetach()
与onAttach相对应,当Fragment与Activity关联被取消时调用
静态使用Fragment
- 1、继承Fragment,重写onCreateView决定Fragemnt的布局
public class MyFragment extends Fragment { public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { View view = inflater.inflate(R.layout.fragment_title, container, false); return view; } } - 2、把Fragment当成普通的View一样声明在Activity的布局文件
动态使用Fragment
- 1、Actvity的布局文件使用FrameLayout
- 2、继承Fragment,重写onCreateView
- 3、使用FragmentManager对Fragment进行动态的加载
FragmentManager fm = getFragmentManager(); // 开启Fragment事务 FragmentTransaction transaction = fm.beginTransaction(); // 使用当前Fragment的布局替代id_content的控件 transaction.replace(R.id.id_fragmentlayout , new_fragmentclass); // 事务提交 transaction.commit();
API
- android.app.Fragment 定义Fragment
- android.app.FragmentManager 操作Fragment
- android.app.FragmentTransaction
//获取FragmentManager v4中,getSupportFragmentManager FragmentManager fm = getFragmentManager(); //开启事务 FragmentTransaction transaction = fm.benginTransatcion(); /***** *以下为FragmentTransactionapi ***** */ //添加 add(int containerViewId, Fragment fragment, String tag) //移除,如果不添加到回退栈,事务提交后Fragment实例将会被销毁 remove(Fragment) //替换 : remove()-->add() replace(int containerViewId, Fragment fragment, String tag) //隐藏,仅仅是设为不可见,并不会销毁 hide(Fragment) //显示之前隐藏的Fragment show(Fragment) //会将view从UI中移除,状态依然由FragmentManager维护 //onPause()-onDestroyView() detach(Fragment) //重建view视图,附加到UI上并显示 //onCreateView()-onResume() attach(Fragment) //事务操作保存到回退栈 addToBackStack(String name) //提交一个事务 commit()
Fragment与Activity通信
- Activity中管理Fragment的引用,可以通过引用直接访问所有的Fragment的public方法
- 每个Fragment都有一个唯一的TAG或者ID,可以通过getFragmentManager.findFragmentByTag()或者findFragmentById()获得任何Fragment实例
- 在Fragment中可以通过getActivity得到当前绑定的Activity的实例,然后进行操作
坑
- 避免activity异常生命周期,fragment多次重建
public class MainActivity extends Activity { private static final String TAG = "FragmentOne"; private FragmentOne mFOne; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); requestWindowFeature(Window.FEATURE_NO_TITLE); setContentView(R.layout.activity_main); Log.e(TAG, savedInstanceState+""); if(savedInstanceState == null) { mFOne = new FragmentOne(); FragmentManager fm = getFragmentManager(); FragmentTransaction tx = fm.beginTransaction(); tx.add(R.id.id_content, mFOne, "ONE"); tx.commit(); } } }