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);
        }
    }
}

 

 

相关文章

Android性能优化——之控件的优化 前面讲了图像的优化,接下...
前言 上一篇已经讲了如何实现textView中粗字体效果,里面主要...
最近项目重构,涉及到了数据库和文件下载,发现GreenDao这个...
WebView加载页面的两种方式 一、加载网络页面 加载网络页面,...
给APP全局设置字体主要分为两个方面来介绍 一、给原生界面设...
前言 最近UI大牛出了一版新的效果图,按照IOS的效果做的,页...