FragmentTransaction使用全解

許佳佳233發表於2017-03-03

前言

之前已經寫過用Fragment做主介面以及Fragment與Activity通訊的文章。兩篇文章如下:
ndroid viewpager+fragment做主介面(超容易理解的demo!)
android Fragment與Activity互動,互相發資料(附圖詳解)

對於Fragment還剩FragmentTransaction沒有具體講到,此篇文章就講一下FragmentTransaction的主要用法,也是對之前的回顧。

(原始碼在文章結尾)

簡單用法

這裡寫圖片描述
如上是Fragment的簡單使用演示,主要程式碼如下:

        btnMainOne =(Button)findViewById(R.id.btn_main_one);

        btnMainOne.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                mFragmentTransaction=getFragmentManager().beginTransaction();
                mFragmentTransaction.replace(R.id.fl_main,new FragmentOne());
                //設定簡單的過度動畫
                mFragmentTransaction.setTransition(FragmentTransaction.TRANSIT_FRAGMENT_OPEN);
                mFragmentTransaction.commit();
            }
        });

FragmentTransaction使用注意

每次在使用FragmentTransaction的時候都需要重新獲取,每一個FragmentTransaction只能夠commit()一次。
用程式碼表示下錯誤使用:

 btnMainOne =(Button)findViewById(R.id.btn_main_one);
 mFragmentTransaction=getFragmentManager().beginTransaction();

        btnMainOne.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {

                mFragmentTransaction.replace(R.id.fl_main,new FragmentOne());
                //設定簡單的過度動畫
                mFragmentTransaction.setTransition(FragmentTransaction.TRANSIT_FRAGMENT_OPEN);
                mFragmentTransaction.commit();
            }
        });

錯誤使用中把FragmentTransaction的獲取挪到了點選事件之前,這樣在點選第二次的時候就會出現錯誤。

新增到返回棧

在使用Fragment的時候,我們經常會有一個這樣的需求,就是需要通過返回鍵讓fragment回覆到之前的一個狀態。使用FragmentTransaction就能很容易做到,效果如下:
這裡寫圖片描述

其實主要就是通過addToBackStack()這個方法,在commit()之前使用,能夠保留commit之前的狀態,在使用返回鍵時,能夠回到之前的狀態。
具體程式碼如下:

這裡寫程式碼片

private void initViewTwo() {
        //主要邏輯在MainActivity的onClick中
        btnMainOne =(Button)findViewById(R.id.btn_main_one);
        btnMainOne.setOnClickListener(this);
        btnMainTwo =(Button)findViewById(R.id.btn_main_two);
        btnMainTwo.setOnClickListener(this);
        btnMainThree =(Button)findViewById(R.id.btn_main_three);
        btnMainThree.setOnClickListener(this);
    }


    @Override
    public void onClick(View v) {
        //每次點選事件都會重新獲取FragmentTransaction
        mFragmentTransaction=getFragmentManager().beginTransaction();

        switch (v.getId()){
            case R.id.btn_main_one:
                if(fraOne==null){
                    fraOne=new FragmentOne();
                }
                mFragmentTransaction.replace(R.id.fl_main,fraOne);
                mFragmentTransaction.addToBackStack(null);//新增fragment到返回棧
                mFragmentTransaction.commit();
                break;
            case R.id.btn_main_two:
                if(fraTwo==null){
                    fraTwo=new FragmentTwo();
                }
                mFragmentTransaction.replace(R.id.fl_main,fraTwo);
                mFragmentTransaction.addToBackStack(null);//新增fragment到返回棧
                mFragmentTransaction.commit();
                break;
            case R.id.btn_main_three:
                if(fraThree==null){
                    fraThree=new FragmentThree();
                }
                mFragmentTransaction.replace(R.id.fl_main,fraThree);
                mFragmentTransaction.addToBackStack(null);//新增fragment到返回棧
                mFragmentTransaction.commit();
                break;
        }
    }

原始碼地址:

http://download.csdn.net/detail/double2hao/9769722

相關文章