zoukankan      html  css  js  c++  java
  • 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);
            }
        }
    }

     

  • 相关阅读:
    S1.2 Python开发规范指南
    time & datetime 模块
    10.27 sort
    basic play
    存储过程常规
    存储过程常规
    div学习之div中dl-dt-dd的详解
    div学习之div中dl-dt-dd的详解
    动态代理与静态代理的区别
    xgqfrms™, xgqfrms® : xgqfrms's offical website of GitHub!
  • 原文地址:https://www.cnblogs.com/mingjie-c/p/12385997.html
Copyright © 2011-2022 走看看