Android開發之一個activity內多個fragment切換


整理一下最近的工作經驗,最近的項目需要一個android程序接收Mqtt服務端發來的周期數據和命令,在幾個界面中切換和顯示數據。需求比較簡單。

這個小項目用到的技術有:fragment切換、service應用、dialogFragment、databinding、EventBus、mqtt、protobuf。

這篇來介紹如何在一個activity中切換多個fragment,以及fragment的靜態加載和動態加載方式。

 

如何在一個activity中切換多個fragment,以及fragment的靜態加載和動態加載方式

1、fragment的靜態加載方式

新建好fragment類后在activity_main.xml 文件中使用如下:

<LinearLayout
    xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    tools:context=".activitys.MainActivity"
    android:orientation="vertical">
<include layout="@layout/nav_bar"/><FrameLayout //這里就是要動態切換的fragment
    android:id="@+id/main_layout"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:layout_weight="1"/><View style="@style/Horizontalline" android:background="@color/transColor"/><fragment //這是是fragment的靜態加載方式
    android:id="@+id/fragment_couchInfo"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:name="com.nms.ird.views.CouchFragment"/><View style="@style/Horizontalline" android:background="@color/transColor"/><include layout="@layout/state_bar" />
</LinearLayout>

 

程序在啟動后就能看到在主界面上的靜態fragment頁面了。

 

2、fragment動態加載

主要分為五步:

  • 創建待添加的碎片實例

  • 獲取FragmentManager,在activity中可以直接通過調用getSupportFragmentManager()方法得到。

  • 開啟一個事務,通過調用beginTransaction()方法開啟。

  • 向容器內添加或替換碎片,add,show,hide,replace等方法實現需要傳入容器的id和待添加的碎片實例。

  • 提交事務,調用commit() 方法來完成。

fragment的活動周期:

 

 

在activity的后台代碼如下:

public class MainActivity extends BaseActivitiy implements GestureDetector.OnGestureListener {
    private Fragment mPatientInfoFragment;
    private Fragment mPositionFragment;
    private Fragment mRegistrationAndBeamOnFragment;
    private Fragment mLogoFragment;
    private String TAG = this.getClass().getSimpleName();
​
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        //根據傳入的Bundle對象判斷Activity是正常啟動還是銷毀重建
        if(savedInstanceState == null){
            //設置第一個Fragment默認選中
            setFragment(REGANDBEAM_FRA);
            Log.e( TAG,"當前線程為:"+ Thread.currentThread() );
        }
    }
​
    public void setFragment(FragmentType index) {
        //獲取Fragment管理器
        FragmentManager mFragmentManager = getSupportFragmentManager();
        //開啟事務
        FragmentTransaction mTransaction = mFragmentManager.beginTransaction();
        //隱藏所有Fragment
        hideFragments(mTransaction);
        switch (index){
            default:
                break;
            case LOGO_FRA:
                //顯示對應Fragment
                if(mLogoFragment == null){
                    mLogoFragment = new LogoFragment();
                    mTransaction.add(R.id.main_layout, mLogoFragment,
                            "logo_fragment");
                }else {
                    mTransaction.show(mLogoFragment);
                }
                break;
            case PATIENTINFO_FRA:
                if(mPatientInfoFragment == null){
                    mPatientInfoFragment = new PatientInfoFragment();
                    mTransaction.add(R.id.main_layout, mPatientInfoFragment,
                            "patient_info_fragment");
                }else {
                    mTransaction.show(mPatientInfoFragment);
                }
                break;
            case POSITION_FRA:
                if(mPositionFragment == null){
                    mPositionFragment = new PositionFragment();
                    mTransaction.add(R.id.main_layout, mPositionFragment,
                            "position_fragment");
                }else {
                    mTransaction.show(mPositionFragment);
                }
                break;
            case REGANDBEAM_FRA:
                if(mRegistrationAndBeamOnFragment == null){
                    mRegistrationAndBeamOnFragment = new RegistrationFragment();
                    mTransaction.add(R.id.main_layout, mRegistrationAndBeamOnFragment,
                            "registration_and_beam_on_fragment");
                }else {
                    mTransaction.show(mRegistrationAndBeamOnFragment);
                }
                break;
        }
        //提交事務
        mTransaction.commitAllowingStateLoss();
        currentFragment = index;
    }
​
    //隱藏Fragment
    private void hideFragments(FragmentTransaction transaction) {
        if(mLogoFragment != null){
            transaction.hide(mLogoFragment);
        }
        if(mPatientInfoFragment != null){
            transaction.hide(mPatientInfoFragment);
        }
        if(mPositionFragment != null){
            transaction.hide(mPositionFragment);
        }
        if(mRegistrationAndBeamOnFragment != null){
            transaction.hide(mRegistrationAndBeamOnFragment);
        }
    }
}

 

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM