Fragment動態加載

項目中用靜態加載的時候不多,所以懶得寫他了,直接寫動態加載的內容。

1.是用App包下的Fragment還是v4包下的:

  1. 首先,Fragment、FragmentManager、FragmentTransaction必須統一,要用App包下的,都用App包下的,要用v4包下的都用v4包下的,否則會出錯。
  2. Fragment是Android 3.0(API 11)後引入的,如果要求3.0以下手機也能正常運行,選擇V4包下的比較合適,但是所在的Activity則必須繼承FragmentActivity,而且獲取FragmentManage的方式要用getSupportFragmentManager。
  3. 如果不要求Android 3.0(API 11)以下的手機能正常運行,還是選擇App包下的吧。

2.Fragment家族常用的API

Fragment常用的三個類:

android.app.Fragment 主要用於定義Fragment
android.app.FragmentManager 主要用於在Activity中操作Fragment
android.app.FragmentTransaction 保證一些列Fragment操作的原子性

a、獲取FragmentManage的方式:

app包中:getFragmentManager() 
v4包中:getSupportFragmentManager

b、主要的操作都是FragmentTransaction的方法

FragmentTransaction transaction = fm.benginTransatcion();//開啓一個事務
transaction.add() 
往Activity中添加一個Fragment
transaction.remove() 
從Activity中移除一個Fragment,如果被移除的Fragment沒有添加到回退棧(回退棧後面會詳細說),這個Fragment實例將會被銷燬。
transaction.replace()
使用另一個Fragment替換當前的,實際上就是remove()然後add()的合體~
transaction.hide()
隱藏當前的Fragment,僅僅是設爲不可見,並不會銷燬
transaction.show()
顯示之前隱藏的Fragment
detach()
會將view從UI中移除,和remove()不同,此時fragment的狀態依然由FragmentManager維護。
attach()
重建view視圖,附加到UI上並顯示。
transatcion.commit()//提交一個事務

3.動態加載流程

  • 獲取FragmentManager對象: getFragmentManager()//getSupportFragmentManager()
  • 獲取beginTransaction對象: fManager.beginTransaction()
  • 調用add()或replace()方法加載Fragment: fTransaction.add(要傳入的對象,fragment對象) // fTransaction.replace(要傳入的對象,fragment對象)
  • commit()提交

    4.核心代碼

public class MainActivity extends Activity implements OnClickListener  
{  
    private LinearLayout mTabWeixin;  
    private LinearLayout mTabFriend;  

    private ContentFragment mWeixin;  
    private FriendFragment mFriend;  

    @Override  
    protected void onCreate(Bundle savedInstanceState)  
    {  
        super.onCreate(savedInstanceState);  
        requestWindowFeature(Window.FEATURE_NO_TITLE);  
        setContentView(R.layout.activity_main);  

        // 初始化控件和聲明事件  
        mTabWeixin = (LinearLayout) findViewById(R.id.tab_bottom_weixin);  
        mTabFriend = (LinearLayout) findViewById(R.id.tab_bottom_friend);  
        mTabWeixin.setOnClickListener(this);  
        mTabFriend.setOnClickListener(this);  

        // 設置默認的Fragment  
        setDefaultFragment();  
    }  

    private void setDefaultFragment()  
    {  
        FragmentManager fm = getFragmentManager();  //獲取FragmentManager對象
        FragmentTransaction transaction = fm.beginTransaction();//獲取beginTransaction對象 
        mWeixin = new ContentFragment();  
        transaction.replace(R.id.id_content, mWeixin);//加載Fragment
        transaction.commit();  //提交
    }  

    @Override  
    public void onClick(View v)  
    {  
        FragmentManager fm = getFragmentManager();  
        // 開啓Fragment事務  
        FragmentTransaction transaction = fm.beginTransaction();  

        switch (v.getId())  
        {  
        case R.id.tab_bottom_weixin:  
            if (mWeixin == null)  
            {  
                mWeixin = new ContentFragment();  
            }  
            // 使用當前Fragment的佈局替代id_content的控件  
            transaction.replace(R.id.id_content, mWeixin);  
            break;  
        case R.id.tab_bottom_friend:  
            if (mFriend == null)  
            {  
                mFriend = new FriendFragment();  
            }  
            transaction.replace(R.id.id_content, mFriend);  
            break;  
        }  
        // transaction.addToBackStack();  
        // 事務提交  
        transaction.commit();  
    }  

}  
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章