写这篇文章 主要解决4个问题,有须要的能够看下
1,fragment究竟是什么东西,与Activity的关系
2,fragment的lifecycle
3,fragment之间的切换
4,fragment传值到Activity
fragment究竟是什么东西呢?英文为碎片,片断,通俗讲就是Activity界面的一个片断,组成部分。一个Activity界面能够有多个fragment 。fragment只能依赖于Activity而存在,像寄生虫同样。
既然fragment依赖于Activity存在,那么fragment的生命周期与Activity息息相关,也就不难理解了。fragment总共有12个生命周期方法:java
onAttach: fragment与它所依附的Activity关联时调用 onCreate: 初始化fragment时调用 onCreateView: 绑定布局xml文件 onActivityCreated: 通知fragment,它所依附的Activity已经oncreate了 onViewStateRestored: 通知fragment,view状态已经被保存 onStart: fragment可见 onResume: fragment聚焦可交互 onPause: fragment失去焦点不可交互 onStop fragment不可见 onDestroyView: fragment能够在该方法中清楚自身view的状态 onDestroy: 清除掉fragment的view状态 onDetach: fragment与Activity之间失去关联
fragment的 生命周期是怎么运行的,与Activity的生命周期又有什么关系呢??以下图所示
当开始运行程序启动activity的同时启动firstFragmentandroid
<pre name="code" class="java">12-09 16:34:45.391 调用的方法是->>onCreate---MainActivity 12-09 16:34:45.391 调用的方法是->>onCreate---FirstFragment 12-09 16:34:45.416 调用的方法是->>onCreateView---FirstFragment 12-09 16:34:45.416 调用的方法是->>onActivityCreated---FirstFragment 12-09 16:34:45.417 调用的方法是->>onViewStateRestored---FirstFragment 12-09 16:34:45.417 调用的方法是->>onStart---MainActivity 12-09 16:34:45.417 调用的方法是->>onStart---FirstFragment 12-09 16:34:45.419 调用的方法是->>onResume---MainActivity 12-09 16:34:45.419 调用的方法是->>onResume---FirstFragment
切换到第二个fragment时,方法调用 过程以下:ide
12-09 16:39:58.159﹕ 调用的方法是->>onCreate---FirstFragment 12-09 16:39:58.159﹕ 调用的方法是->>onStop---FirstFragment 12-09 16:39:58.159﹕ 调用的方法是->>onDestroyView---FirstFragment 12-09 16:39:58.162﹕ 调用的方法是->>onDestroy---FirstFragment 12-09 16:39:58.162﹕ 调用的方法是->>onDetach---FirstFragment
退出程序时,方法执行顺序以下:布局
12-09 16:44:02.387﹕ 调用的方法是->>onCreate---FirstFragment 12-09 16:44:02.387﹕ 调用的方法是->>onPause---MainActivity 12-09 16:44:03.064﹕ 调用的方法是->>onStop---FirstFragment 12-09 16:44:03.066﹕ 调用的方法是->>onDestroyView---FirstFragment 12-09 16:44:03.068﹕ 调用的方法是->>onDestroy---FirstFragment 12-09 16:44:03.069﹕ 调用的方法是->>onDetach---FirstFragment 12-09 16:44:03.069﹕ 调用的方法是->>onyDestroy---MainActivity
总结一下fragment与activity生命周期关系流程图以下:
建立一个很简单的fragment,以下,
fragment_first.xml文件this
<?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent" android:layout_height="match_parent" android:gravity="center" android:orientation="vertical"> <TextView android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="这是第一个fragment" /> <TextView android:id="@+id/jump" android:layout_width="wrap_content" android:layout_height="wrap_content" android:padding="20dp" android:text="点击进入下一页" /> </LinearLayout>
FirstFragment.class文件code
@Nullable @Override public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { mRootView = inflater.inflate(R.layout.fragment_first, container, false); mJump = (TextView) mRootView.findViewById(R.id.jump); mJump.setOnClickListener(this); return mRootView; }
接下来同理,建立出第二个fragment--SecondFragment。 建立多个fragment后,需将fragment与Activity联系起来,fragment 之间也须要切换,
activity_main.xml文件xml
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent" android:layout_height="match_parent" android:paddingBottom="@dimen/activity_vertical_margin" android:paddingLeft="@dimen/activity_horizontal_margin" android:paddingRight="@dimen/activity_horizontal_margin" android:paddingTop="@dimen/activity_vertical_margin" tools:context=".MainActivity"> <RelativeLayout android:id="@+id/rl_fragment_container" android:layout_width="match_parent" android:layout_height="wrap_content" /> <LinearLayout android:layout_width="match_parent" android:layout_height="wrap_content" android:layout_alignParentBottom="true" android:gravity="center" android:orientation="horizontal" android:paddingBottom="20dp" android:paddingTop="20dp"> <TextView android:id="@+id/first" android:layout_width="0dp" android:layout_height="wrap_content" android:layout_weight="1" android:gravity="center" android:text="第一个" android:paddingTop="10dp" android:paddingBottom="10dp"/> <TextView android:id="@+id/second" android:layout_width="0dp" android:layout_height="wrap_content" android:layout_weight="1" android:gravity="center" android:text="第二个" android:paddingBottom="10dp" android:paddingTop="10dp"/> </LinearLayout> </RelativeLayout>
MainActivity.class文件生命周期
@Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); mFirstFragment = (TextView) findViewById(R.id.first); mSecondFragment = (TextView) findViewById(R.id.second); mFirstFragment.setOnClickListener(this); mSecondFragment.setOnClickListener(this); changeFragment(firstFragment); } @Override public void onClick(View v) { switch (v.getId()){ case R.id.first: changeFragment(firstFragment); break; case R.id.second: changeFragment(secondFragment); break; } } private void changeFragment(Fragment fragment) { FragmentManager manager = getFragmentManager(); FragmentTransaction fragmentTransaction = manager.beginTransaction(); fragmentTransaction.replace(R.id.rl_fragment_container, fragment); fragmentTransaction.commit(); fragmentTransaction.show(fragment); }
fragment与activity之间传值:FirstFragment.class文件utf-8
@Override public void onClick(View v) { switch (v.getId()) { case R.id.jump: Intent intent = new Intent(getActivity(), MyNext.class); intent.putExtra("key", "value"); startActivity(intent); break; } }
效果图以下图所示:
这是主界面,启动程序时显示FirstFragment,底部有两个按钮用来切换fragment,点击进入下一页,能够打开 另外一个activity,以下图:
get