標籤:
在android開發過程中,如果使用到了導覽列。那麼不可避免的就需要使用fragment來處理介面。閑著沒事,就詳解一下Framgent的使用方法吧。
難得寫一次。本人
shoneworn
shonewron
shoneworn
重要事情說三遍。
1.Fragment 的生命週期
情境示範 : 切換到該Fragment
11-29 14:26:35.095: D/AppListFragment(7649): onAttach
11-29 14:26:35.095: D/AppListFragment(7649): onCreate
11-29 14:26:35.095: D/AppListFragment(7649): onCreateView
11-29 14:26:35.100: D/AppListFragment(7649): onActivityCreated
11-29 14:26:35.120: D/AppListFragment(7649): onStart
11-29 14:26:35.120: D/AppListFragment(7649): onResume
螢幕滅掉:
11-29 14:27:35.185: D/AppListFragment(7649): onPause
11-29 14:27:35.205: D/AppListFragment(7649): onSaveInstanceState
11-29 14:27:35.205: D/AppListFragment(7649): onStop
螢幕解鎖
11-29 14:33:13.240: D/AppListFragment(7649): onStart
11-29 14:33:13.275: D/AppListFragment(7649): onResume
切換到其他Fragment:
11-29 14:33:33.655: D/AppListFragment(7649): onPause
11-29 14:33:33.655: D/AppListFragment(7649): onStop
11-29 14:33:33.660: D/AppListFragment(7649): onDestroyView
切換回本身的Fragment:
11-29 14:33:55.820: D/AppListFragment(7649): onCreateView
11-29 14:33:55.825: D/AppListFragment(7649): onActivityCreated
11-29 14:33:55.825: D/AppListFragment(7649): onStart
11-29 14:33:55.825: D/AppListFragment(7649): onResume
回到案頭
11-29 14:34:26.590: D/AppListFragment(7649): onPause
11-29 14:34:26.880: D/AppListFragment(7649): onSaveInstanceState
11-29 14:34:26.880: D/AppListFragment(7649): onStop
回到應用
11-29 14:36:51.940: D/AppListFragment(7649): onStart
11-29 14:36:51.940: D/AppListFragment(7649): onResume
退出應用
11-29 14:37:03.020: D/AppListFragment(7649): onPause
11-29 14:37:03.155: D/AppListFragment(7649): onStop
11-29 14:37:03.155: D/AppListFragment(7649): onDestroyView
11-29 14:37:03.165: D/AppListFragment(7649): onDestroy
11-29 14:37:03.165: D/AppListFragment(7649): onDetach
可以看出,和activity還是有差別的。
2.fragment的使用
fragment使用的時候,合理的選擇容器是很重要的。如果容器選擇不對。那麼就可能達不到自己想要的效果。
由於fragment在viewgroup中是作為一個view來顯示的。也就是只能作為一部分。所以,如果fragment不能覆蓋整個螢幕,就會出現原來的view和新的view一起顯示的景象。下面是用我線性布局來做為容器來放fragment。先看看出現的什麼效果吧
點擊textview1 後建立新的fragment2 。每次點擊後,fragment2沒有去沾滿螢幕。而是不停的向下依次排列。在點擊返回鍵後,又一次的回退,將fragment2 pop出棧。
布局檔案:
fragment1.xml
<?xml version="1.0" encoding="utf-8"?><LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:id="@+id/container" android:layout_width="match_parent" android:layout_height="match_parent" android:orientation="vertical" > <TextView android:id="@+id/textView1" android:layout_width="match_parent" android:layout_height="40dp" android:background="#32dfda" android:gravity="center" android:text="TextView1" android:textSize="18sp" /> <TextView android:id="@+id/textView2" android:layout_width="match_parent" android:layout_height="40dp" android:background="#36df0a" android:gravity="center" android:text="TextView1" android:textSize="18sp" /> <TextView android:id="@+id/textView3" android:layout_width="match_parent" android:layout_height="40dp" android:background="#82dfda" android:gravity="center" android:text="TextView1" android:textSize="18sp" /></LinearLayout>
fragment1.java 代碼:
package com.ailin.accm.activity;import com.ailin.accm.R;import android.content.Context;import android.os.Bundle;import android.support.v4.app.Fragment;import android.support.v4.app.FragmentTransaction;import android.view.LayoutInflater;import android.view.View;import android.view.View.OnClickListener;import android.view.ViewGroup;import android.widget.TextView;public class Fragment1 extends Fragment { private Context context; public Fragment1(Context context) { this.context = context; } @Override public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { View view = inflater.inflate(R.layout.fragment1, null); initView(view); return view; } private void initView(View view) { TextView tv1 = (TextView) view.findViewById(R.id.textView1); tv1.setOnClickListener(new OnClickListener() { @Override public void onClick(View v) { Fragment2 fg2 = new Fragment2(context); FragmentTransaction fragmentTrans = getFragmentManager().beginTransaction(); fragmentTrans.setTransition(FragmentTransaction.TRANSIT_FRAGMENT_OPEN); fragmentTrans.add(R.id.container, fg2, "fg2"); fragmentTrans.addToBackStack(null); fragmentTrans.commit(); } }); } }
從上面可以看出,線上性布局container中,fragment2作為一個view,被依container依次給addview進去了。那麼,如果container換成相對布局呢?又會是什麼樣子?
可以看出,這個時候,在點擊textview1的話,fragment2,就會覆蓋fragment1.
PS:補充說明一下,container在添加fragment2 作為view的時候,會進行一次重繪。所以,在設定fragment2.xml的時候,最好使用相對布局RelativeLayout .否則,你的fragment在tab2中能正常顯示,但是,拿到fragment1中作為一個view添加上去了,是按照絕對大小來添加的。給大家看看效果吧。
fragment1 使用相對布局作為容器。 fragment2.xml 中使用線性布局。效果看。
但是如果fragment2.xml也換成了相對布局,效果就是第二幅圖那樣了。
鳴謝:http://blog.csdn.net/forever_crying/article/details/8238863/
借用了一下對方的圖。文章也寫的很好。
android——fragment詳解