Fragment的使用

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生命周期


fragment 生命周期
fragment 生命周期

Activity生命周期


Activity生命周期
Activity生命周期

兩者對比


Activity和Fragment聲明周期對比
Activity和Fragment聲明周期對比

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中。

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
【社區(qū)內容提示】社區(qū)部分內容疑似由AI輔助生成,瀏覽時請結合常識與多方信息審慎甄別。
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發(fā)布,文章內容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務。

相關閱讀更多精彩內容

友情鏈接更多精彩內容