Fragment 相关

来源:互联网 发布:模拟网络攻击软件 编辑:程序博客网 时间:2024/06/06 05:55

一,Fragment的创建:
1,创建Fragment的XML布局,创建NewsTitleFragment extends Fragment,重写onCreateView()

    @Override    public View onCreateView(LayoutInflater inflater, ViewGroup container,                             Bundle savedInstanceState) {        Log.i(TAG,"onCreateView()");        View view=inflater.inflate(R.layout.fragment_news_title, container, false);        return view;    }

2,Fragment的生命周期方法:

   onAttach(Context context)   onCreate(Bundle savedInstanceState)   onCreateView()   onActivityCreated()   onStart()   onResume()   onPause()   onStop()   onDestroyView()   onDestroy()   onDetach()

其与关联Activity生命周期的关系:(在XML中静态引入Fragment的情况)
I/MainActivity: onCreate()
I/NewsTitleFragment: onAttach()
I/NewsTitleFragment: onCreate()
I/NewsTitleFragment: onCreateView()

I/MainActivity: onStart()
I/NewsTitleFragment: onActivityCreated()
I/NewsTitleFragment: onStart()

I/MainActivity: onResume()
I/NewsTitleFragment: onResume()

I/MainActivity: onPause()
I/NewsTitleFragment: onPause()

I/MainActivity: onStop()
I/NewsTitleFragment: onStop()

PS.一般我们说一个Activity或其关联的Fragment要运行到onResume()后才能看见,经调试确认是在onResume()执行完后处于运行状态是可见。

二,Fragment的使用:
1,XML中静态引用,通过name属性

<fragment    android:layout_width="match_parent"    android:layout_height="match_parent"    android:name="com.example.archermind.fragment.NewsTitleFragment"/>

2,code中动态添加:

        NewsContentFragment fragment=new NewsContentFragment();        FragmentManager fragmentManager=getFragmentManager();        FragmentTransaction transaction=fragmentManager.beginTransaction();        transaction.replace(R.id.news_content_fg,fragment);        transaction.commit();

注意:transaction.replace()会替换之前的fragment,如果存在的话,之前的fragment会执行onPause()->onStop()->onDestroy()被销毁。
可以在transaction.commit()之前调用transaction.addToBackTask(null)让其处于提示状态,之后按Back建会再次显示。

三,Fragment与Activity相互通信
1,Activity操作Fragment:

NewsContentFragment fragment=(NewsContentFragment)getFragmentManager().findFragmentById(R.id.news_content_fg);

2,Fragment操作Activity:

getActivity().findViewById(R.id.news_content_layout)!=null)

注:在Fragment中调用getActivity()可以得到与之关联的Activity实例。通知这也是获得Context对象的方式。
另:findViewById()这个方法不仅仅是View含有,Activity中也含有

@Nullablepublic View findViewById(@IdRes int id) {    return getWindow().findViewById(id);}

3,Fragment最初是为平板适配而来的,适配方式可以在不同layout文件夹下面创建同名的XML,XML中做各自不同的布局,程序运行时会
根据自身设备的情况去选择加载不同layout下的xml。