整理一下最近的工作經驗,最近的項目需要一個android程序接收Mqtt服務端發來的周期數據和命令,在幾個界面中切換和顯示數據。需求比較簡單。
這個小項目用到的技術有:fragment切換、service應用、dialogFragment、databinding、EventBus、mqtt、protobuf。
這篇來介紹如何在一個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); } } }