1.fragment的基本使用方法
分為靜態(tài)加載和動態(tài)加載:
(1)靜態(tài)加載
即通過在XML文件中定義的方法定義fragment,可通過 <fragment/>標簽來實現。
fragment中需要指定 android:name 屬性,它指定了在layout中實例化的Fragment類。另外需要注意的是, 在靜態(tài)加載的方法中必須為Fragment添加一個唯一的標識(可以是id也可以是tag)
<fragment android:id="@+id/main_fragment"
android:name="com.example.fragmenttest.Fragment1"
android:layout_width="match_parent"
android:layout_height="match_parent">
</fragment>
注:如果使用的是fragment標簽,那么在android:name屬性中指定的Fragment類必須是 android.app.Fragment,
而不能是android.support.v4.app.Fragment;
否則將會報錯InflateException。(為什么???)
報錯的原因是因為,Fragment所在的Activity中使用的是Activity,而不是v4包中的FragmentActivity。
Q:怎么在XML中使用support.v4包中的Fragment?
app.fragment和v4.fragment都是可以使用<fragment>標簽的
如果使用app.fragment則沒有什么特殊的地方,其所屬的Activity直接繼承Activity即可。
當v4.fragment使用<fragment>標簽的時候就要特別注意了:
當這個Activity的布局中有<fragment>標簽的時候,這個Activity必須繼承FragmentActivity,否則就會報錯
盡量不要用app包中的fragment,因為這個是在3.0之后才有的,支持的版本太高,在低版本中是是用不了的。android.support.v4.app.Fragment:可以兼容到1.6的版本,
[http://blog.csdn.net/a465456465/article/details/10415211]
2.動態(tài)加載
根據用戶交互,對Fragment進行添加、移除、替換等動作。
基本模式:
Fragment1 fragment1 = new Fragment1();
FragmentManager manager = getFragmentManager();
FragmentTransaction transaction = manager.beginTransaction();
transaction.add(R.id.main_fragcontainer, fragment1).commit();
對于動態(tài)加載,使用supportv4包中的Fragment則比較簡單,除了所需要引用的相關類都是用v4包中的類以外,思路基本一致。一個需要額外注意的就是,所使用的Activity應該是v4包中的FragmentActivity,此外在獲取FragmentManager時,應該使用getSupportFragmentManager.
FragmentManager manager = getSupportFragmentManager();
fragment生命周期
Fragment的生命周期
1、 onAttach();//當fragment被添加到activity中時會回調這個方法;只會調用一次
2、 onCreate();//在fragment創(chuàng)建的時候回調這個方法;只會調用一次;
3、 onCreateView()://每次創(chuàng)建都會繪制Fragment的View組件時調用該方法,相當于fragment綁定一個布局,布局文件轉換成view返回回來;
4、 onActivityCreated();//fragment所在的activity啟動完成后調用;
5、 onStart():啟動Fragment時會被回調,
6、 onResume()方法,調用onStart()方法后面一定會調用這個方法,恢復fragment時回調
7、 onPause():暫停Fragment
8、 onStop();//停止Fragment
9、 onDestroyView():銷毀Fragment所包含的View組件,與onCreateView相對應
10、 onDestroy():銷毀Fragment時會被回調
11、 onDetach():Fragment從Activity中刪除時回調這個方法,并且只調用一次
啟動fragment
onAttach()->onCreate()->onCreateView()->onActivityCreated()->onStart()->onResume()
屏幕鎖屏
onPause()->onStop()
屏幕解鎖
onStart()->onResume()
第一個fragment切換到第二個fragment
第一個 :
onPause()->onStop()->onDestoryView()->onDestory()->onDetach();
第二個:
onAttach()->onCreate()->onCreateView()->onActivityCreated()->onStart()->onResume()
Fragment生命周期

Activity生命周期

兩者對比

Activity 和 Fragment通信
1.Fragment和Activity通信
(1)Activity向Fragment發(fā)送數據
在Activity中調用Fragment的setArguments(Bundle bundle)方法,在Fragment中通過getArguments()方法,即可得到Activity發(fā)送的數據。
MainActivity中
fragment1.setArguments(bundle);
Fragment中
TextView tv=(TextView) view.findViewById(R.id.frag_tv);
tv.setText(getArguments().getString("name"));
2.Fragment向Activity通信
需要在Fragment中定義一個interface接口,再讓包含該Fragment的Activity實現該方法,這樣Fragment中可以調用該方法將數據傳遞給activity。
需要在onAttach方法中獲得該接口的activity實例。
interface FragInterface{
void doso(String s);
}
@Override
public void onAttach(Activity activity) {
// TODO Auto-generated method stub
mInterface=(FragInterface)activity;
super.onAttach(activity);
}
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
// TODO Auto-generated method stub
View view = inflater.inflate(R.layout.fragement, container,false);
TextView tv=(TextView) view.findViewById(R.id.frag_tv);
tv.setText(getArguments().getString("name"));
mInterface.doso("thank!");
return view;
}
通過在Fragment中調用interface中的方法,即可通過該方法的參數把這個數據傳送到了Activity中。