整理一下最近的工作经验,最近的项目需要一个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动态加载
主要分为五步:
fragment的活动周期:
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); } } }
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。