Android Fragment 巧妙利用 show和hide

Android Fragment底部菜单切换实战:使用show()和hide()保留Fragment状态 null} else {@JvmField记住口诀:- 继承- 实现CREATOR- 父类状态不能丢搞定!经过这么多铺垫,我们来整合出一套生产级可用的代码骨架:= null) {// 设置默认选中trueif (! 阅读详情

Android Fragment 巧妙利用 show和hide。这里咱们分两种情况来做相应的处理。
第一种:switch 是以break;结束
Java代码片段

public class ContextFragment extends Fragment {

    @BindView(R.id.frame_layout)
    FrameLayout frameLayout;
    @BindView(R.id.navigation)
    BottomNavigationView navigation;
    Unbinder unbinder;
    private View mView;
    private BlankFragment1 mABlankFragment;
    private BlankFragment2 mBBlankFragment;
    private BlankFragment3 mCBlankFragment;

    private BottomNavigationView.OnNavigationItemSelectedListener mOnNavigationItemSelectedListener
            = new BottomNavigationView.OnNavigationItemSelectedListener() {

        @Override
        public boolean onNavigationItemSelected(@NonNull MenuItem item) {
            //事务
            FragmentManager fm = getFragmentManager();
            FragmentTransaction transaction = fm.beginTransaction();

            // 先隐藏掉所有的Fragment,以防止有多个Fragment显示在界面上的情况
            hideFragments(transaction);

            switch (item.getItemId()) {
                case R.id.navigation_home:
                    //显示、加载Fragment
                    if (mABlankFragment == null) {
                        // 如果fragment为空,则创建一个并添加到界面上  
                        mABlankFragment = new BlankFragment1();
                        transaction.add(R.id.frame_layout, mABlankFragment);
                    } else {
                        // 如果Fragment不为空,则直接将它显示出来  
                        transaction.show(mABlankFragment);
                    }
//                    return true;
                    break;
                case R.id.navigation_dashboard:
                    //显示、加载Fragment
                    if (mBBlankFragment == null) {
                        // 如果fragment为空,则创建一个并添加到界面上  
                        mBBlankFragment = new BlankFragment2();
                        transaction.add(R.id.frame_layout, mBBlankFragment);
                    } else {
                        // 如果Fragment不为空,则直接将它显示出来  
                        transaction.show(mBBlankFragment);
                    }
//                    return true;
                    break;
                case R.id.navigation_notifications:
                    //显示、加载Fragment
                    if (mCBlankFragment == null) {
                        // 如果fragment为空,则创建一个并添加到界面上  
                        mCBlankFragment = new BlankFragment3();
                        transaction.add(R.id.frame_layout, mCBlankFragment);
                    } else {
                        // 如果Fragment不为空,则直接将它显示出来  
                        transaction.show(mCBlankFragment);
                    }
//                    return true;
                    break;
                default:
            }
            transaction.commit();
            return false;
        }
    }; 
     private void hideFragments(FragmentTransaction transaction) {
        if (mABlankFragment != null) {
            transaction.hide(mABlankFragment);
        }
        if (mBBlankFragment != null) {
            transaction.hide(mBBlankFragment);
        }
        if (mCBlankFragment != null) {
            transaction.hide(mCBlankFragment);
        }

    }

    @Nullable
    @Override
    public View onCreateView(@NonNull LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {
        mView = inflater.inflate(R.layout.view_page_context, container, false);
        initView();
        unbinder = ButterKnife.bind(this, mView);
        return mView;
    }

    private void initView() {
        BottomNavigationView navigation = mView.findViewById(R.id.navigation);
        navigation.setOnNavigationItemSelectedListener(mOnNavigationItemSelectedListener);

    }


    @Override
    public void onDestroyView() {
        super.onDestroyView();
        unbinder.unbind();
    }
}

第二种:switch 是以return;结束

public class MainActivity extends BaseActivity {

    private PrimaryFragment primaryFragment;
    private JuniorHighFragment juniorHighFragment;
    private HighFragment highFragment;
    private boolean isOne = true;

    private BottomNavigationView.OnNavigationItemSelectedListener mOnNavigationItemSelectedListener
            = new BottomNavigationView.OnNavigationItemSelectedListener() {

        @Override
        public boolean onNavigationItemSelected(@NonNull MenuItem item) {
            FragmentManager fragmentManager = getSupportFragmentManager();
            FragmentTransaction transaction = fragmentManager.beginTransaction();
            //隐藏所有fragment
            hideAllFragment(transaction);
            switch (item.getItemId()) {
                case R.id.navigation_home:
                    if (highFragment == null) {
                        Log.e("空空如也", "onNavigationItemSelected: ");
                        //这里这样写,是因为我们在布局中默认静态加载该碎片(这里显示出来就好)
                        //静态和动态好像不能一起使用,会出问题,不注释就会出现空白,
                        //highFragment = new HighFragment();
                        //transaction.add(R.id.move_fragment, highFragment);
                    } else {
                        transaction.show(highFragment);
                    }
                    //提交事务这个骚操作不能写在外层了,会没反应
                    transaction.commit();
                    return true;
                case R.id.navigation_dashboard:

                    if (juniorHighFragment == null) {
                        juniorHighFragment = new JuniorHighFragment();
                        transaction.add(R.id.move_fragment, juniorHighFragment);
                    } else {
                        transaction.show(juniorHighFragment);
                    }
                    transaction.commit();
                    return true;
                case R.id.navigation_notifications:
                    if (primaryFragment == null) {
                        primaryFragment = new PrimaryFragment();
                        transaction.add(R.id.move_fragment, primaryFragment);
                    } else {
                        transaction.show(primaryFragment);
                    }
                    transaction.commit();
                    return true;
                default:
            }
            return false;
        }
    };

    /**
     * 隐藏所有fragment
     */
    private void hideAllFragment(FragmentTransaction transaction) {
        if (primaryFragment != null) {
            transaction.hide(primaryFragment);
        }
        if (juniorHighFragment != null) {
            transaction.hide(juniorHighFragment);
        }
        if (highFragment != null) {
            transaction.hide(highFragment);
        }
    }


    @Override
    protected int getLayoutId() {
        return R.layout.activity_main;
    }

    @Override
    protected void initView() {
//        if (isOne) {
//            FragmentManager fragmentManager = getSupportFragmentManager();
//            FragmentTransaction transaction = fragmentManager.beginTransaction();
//            HighFragment highFragment = new HighFragment();
//            transaction.add(R.id.move_fragment, highFragment);
//            transaction.commit();
//        }
        BottomNavigationView navigation = findViewById(R.id.navigation);
        navigation.setOnNavigationItemSelectedListener(mOnNavigationItemSelectedListener);
    }
}

两种情况的xml代码片段是一样的

?xml version="1.0" encoding="utf-8"?>
<android.support.constraint.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    xmlns:app="http://schemas.android.com/apk/res-auto">

    <FrameLayout
        android:id="@+id/frame_layout"
        android:layout_width="match_parent"
        android:layout_height="match_parent">

        <fragment
            android:id="@+id/left_fragment"
            android:layout_width="match_parent"
            android:layout_height="match_parent"
            android:name="com.liaichuan.top.ui.fragment.BlankFragment1"/>

    </FrameLayout>

    <android.support.design.widget.BottomNavigationView
        android:id="@+id/navigation"
        android:layout_width="0dp"
        android:layout_height="wrap_content"
        android:layout_marginEnd="0dp"
        android:layout_marginStart="0dp"
        android:background="?android:attr/windowBackground"
        app:layout_constraintBottom_toBottomOf="parent"
        app:layout_constraintLeft_toLeftOf="parent"
        app:layout_constraintRight_toRightOf="parent"
        app:menu="@menu/navigation" />

</android.support.constraint.ConstraintLayout>
fragment 通过show和hide 实现界面切换 fragment 通过show和hide 实现界面切换,简单封装一些基类................................................................ 立即下载

相关推荐

Android使用Fragment实现底部菜单使用show()和hide()来切换以保持Fragment状态

最近写了一个关于使用Fragment实现底部菜单使用show()和hide()来切换以保持Fragment状态的demo,上传到这里和大家交流学习

Android Fragment使用show/hide的方式进行页面切换-----简单实用--个人记录

主要代码在activity 这里贴出来了 package com.test.testdemo; import androidx.appcompat.app.AppCompatActivity; import androidx.fragment.app.FragmentTransaction; import android.os.Bundle; import android.view.View; import android.widget.TextView; import com.test.test

qq_42634876的博客 1318

从SRIOV到SIOV:PCIe虚拟化技术下一代革命

如果说SR-IOV是过去十年PCIe虚拟化的“标杆方案”,那SIOV就是为超大规模云数据中心、AI集群量身打造的“破局者”——它解决了SR-IOV难以逾越的扩展性瓶颈,同时平衡了性能、成本与生态兼容性。今天就从“为什么需要SIOV”到“SIOV到底强在哪”,再到“未来要解决什么问题”,做一次全方位深度拆解。

存储随笔 2557

Android中Fragment的Hide和Show

  我们都知道,Fragment动态添加的时候我们可以使用FragmentTransaction的add和replace方法,replace方法就等效于对这个Fragment先执行remove(),再执行add()。但是在实际的项目中,有很多时候我们会用到底部是一个RadioGroup包裹的RadioButton,上面用Fragment的情况,因为我们是从网络上获取的数据,这种时候我们不希望点击加...

weixin_30666401的博客 409

汽车OTA自动化测试解决方案

目前OTA远程升级技术已成为众多汽车制造商的标配。由于OTA升级可能会带来潜在的风险(特别是包含ECU固件更新的FOTA升级),针对OTA系统的测试过程就尤为重要。

东舟技术的博客 7757

Penpot自托管全攻略:5分钟搞定私有化部署(附Docker配置详解)

本文详细介绍了Penpot开源原型设计工具的私有化部署全流程,从Docker基础配置到企业级优化方案。通过分步指南和实战技巧,帮助设计团队快速搭建安全高效的自托管环境,实现数据自主可控。内容涵盖LDAP集成、性能监控、备份策略等关键企业需求,是Penpot私有化部署的完整参考手册。

sugar的博客 1131

android-Fragment-hide和show

为了节约资源,现在很多 app 采用了 replace() 方法来实现碎片的切换,但是在这种情宽下,如果不讲之前的碎片雅茹栈中,就无法避免之前碎片回随之销毁,所以我们采用 hide() 和 show() 方法来实现碎片的切换。 实现效果 效果图项目地址--https://github.com/FishInWater-1999/android-SignInSystem 这里不讲废话直接...

圆号本号 967

Keil5调试遇坑记:手把手解决J-Link驱动与固件版本冲突(附老版本驱动包)

本文详细解析了Keil5与J-Link调试器版本冲突问题,特别是当出现'The connected J-Link is defective'警告时的解决方案。通过对比升级固件与降级驱动的优缺点,提供了详细的J-Link驱动降级操作指南,包括获取老版本驱动、替换步骤及常见问题排查,帮助开发者高效解决这一常见调试障碍。

metaverse5vr的博客 107

安卓 Fragment方法add show hide

Android中add()、show()和hide()方法用于高效管理Fragment的显示与隐藏,适用于需要频繁切换且保留状态的界面。add()方法添加Fragment并完整执行生命周期,show()和hide()仅控制视图可见性而不影响生命周期。相比replace()会销毁Fragment,hide/show组合能保留状态但占用更多内存,适合底部Tab切换等场景。示例展示了三个Fragment的切换实现,通过FragmentTransaction管理,结合addToBackStack支持返回操作。关键优

梦想不只是梦与想的博客 942

SQL Server 2025在Windows 11上的安装避坑指南

SQL Server 是微软主流关系型数据库管理系统,其安装与Windows操作系统深度耦合;Windows 11作为新一代桌面平台,强化了基于虚拟化的安全(HVCI)、驱动签名强制策略(WDAC)及内核隔离机制,导致传统数据库部署流程失效。理解二者底层交互原理,是解决服务启动失败、配置管理器无法打开、远程连接被拒等高频问题的技术前提。本文聚焦SQL Server 2025与Windows 11的兼容性挑战,覆盖系统预配置、安装节点诊断、防火墙与服务权限调优等工程实践环节,适用于高校教学、电赛备赛、中小企业

weixin_28741413的博客 316

乐视三合一体感摄像头--基本信息及windows下部分开发

乐视三合一体感摄像头--基本信息及windows下部分开发Introduction基本信息Windows下使用安装驱动使用openNI使用imageJ调用RGB图像Q:参考资料 Introduction       乐视三合一体感摄像头是乐视对标kinect,做的一款3D体感摄像头;设计目的为用于电视机上体感使用的,包括其USB结构都是为了符合电视机直接操作的,同时是支持相应的游戏操作;但是自从乐视倒闭之后,价格从之前标价899降到了现在140+左

GRF-Sunomikp31 1万+

[Android]Fragment加载替换add,show,hide,replace方法

Fragment切换

小黑屋 2万+

YOLO26改进105:全网首发--使用BiFPN改进特征金字塔网络

YOLOv6 v3.0在目标检测领域实现重大突破,通过改进网络架构和训练方案显著提升性能。该版本在COCO数据集上展现出优越表现:YOLOv6-N达到37.5% AP/1187 FPS,YOLOv6-S实现45.0% AP/484 FPS,均超越同类检测器。大模型YOLOv6-M/L分别达到50.0%/52.8% AP,L6版本更创下实时检测新纪录。关键技术包括RepVGGBlock、BiFusion等新型模块,通过多分支融合和高效重参数化设计提升性能。研究团队已验证各改进模块有效性,代码已开源。

AIcurator的博客 95

Fragment的show和hide

package kk.com.yuekao; import android.os.Bundle; import android.support.v4.app.FragmentActivity; import android.support.v4.app.FragmentManager; import android.support.v4.app.FragmentTransaction; imp...

wangshuo_的博客 2356

【YOLOv8-pose姿态识别部署至RK3588:模型训练到RKNN落地,让人体姿态分析精度与边缘推理速度双突破】

本教程从YOLOv8-pose模型的姿态识别训练,到RK3588的边缘量化部署,为你打造了一套“高精度+高实时性+低成本”的人体姿态分析解决方案。无论是健身动作纠正、智能安防行为检测,还是工业人员姿态监控,这套技术都能直接复用——你只需替换数据集与业务逻辑,即可快速落地专属的边缘AI姿态识别系统。如果你在实践中遇到任何卡点,欢迎随时交流。记住,人体姿态识别的价值在于“关键点准、推理快、部署易”,而这三者的平衡,正是你通过本教程能掌握的核心能力。

FJN110的博客 328

IEM模型,地表粗糙度模拟

利用微波反演土壤水分时候,利用IEM模型可以实现对随机地表的模拟

Android Fragment的add,show,hide一定要一起用吗?

Fragment的add,show,hide一定要一起用吗? 问题 两个fragment, fragmentTest1和fragmentTest2, 初始化fragmentTest1, 代码如下: supportFragmentManager.beginTransaction() .add(R.id.content, fragmentTest1, FragmentTest1::class.java.simpleName) .commit() 然后在一个点击事件跳转到fragmentTest

那时候的坚持不懈的我的博客 856

ET2012新版免狗免安装绿色软件

ET2012新版免狗免安祖昂绿色软件。,新界面,新视觉,

Android Fragment中使用hide/show出现页面重叠、穿透现象

Android Fragment中使用hide/show出现页面重叠、在小米手机上,点击这三个Fragment的时候出现能隐约的看到已经被隐藏的Fragment。还有,在华为手机上,当一个activity奔溃以后重新返回后出现界面严重穿透重叠问题

麦田de守望 9606

VB摄像头监控

该VB模块可对摄像头捕获的画面进行录像等,可在创建的窗口进行控制

pscad IEEE标准系统搭建说明

pscad IEEE标准系统搭建说明,包含典型的IEEE 9节点、14节点、30节点、39节点和118节点系统。内含标准测试系统的原始数据和潮流结果。

Android 使用hide()和show()方法切换Fragment时的问题

在项目中切换Fragment,一直都是用replace()方法来替换Fragment。但是这样做有一个问题,每次切换的时候Fragment都会重新实列化,重新加载一次数据,这样做会非常消耗性能用用户的流量。 官方文档解释说:replace()这个方法只是在上一个Fragment不再需要时采用的简便方法。 正确的切换方式是add(),切换时hide(),add()另一个Fragm

wangqou1992的博客 3774

Fragment --replace方法和hide、show方法的生命周期分析

总结:1、replace,加回退栈,Fragment不销毁,但是切换回销毁视图和重新创建视图。          2、replace,不加回退栈,Fragment销毁掉。          3、hide、show,Fragment不销毁,也不销毁视图。隐藏和显示不走生命周期。1、Fragment采取replace方法替换、并加入回退栈。private void replaceFragment(in...

tiantaiaiqing的专栏 1万+

Android切换fragment保留当前状态(show,hide,回退栈)

在使用多个fragment时,从fragment A切换到fragment B时,我们希望fragment A的生命周期停止,保留当前状态;处理完成后,在返回到fragment A进行更新数据. 实现这样的功能 不能使用FragmentTransaction的replace,该方法是先remove所有存在的fragment,再add当前要显示的fragment.若进行切换,原来的fragment对...

sunyFS的博客 2273

Fragment的replace、add、hide、show的使用和详解

我们经常使用碎片,并且知道他可以动态的替换,但是你知道他可以使用那些方法进行替换,add方法又是怎么使用吗。下面我罗列了一下常用的使用方法。 - relpleac:替换碎片 这个方法在执行的时候会将之前的碎片给清空掉。也就是说当你在用这个方法动态添加碎片的时候,他会将容器里面的所有碎片全部清空,生命周期直接销毁。然后将你要replace的碎片进行显示。 getSupportFragmentMan...

345丶 8047

安卓开发之fragment切换

Fragment是一个灵活的用户界面组件,可以将Activity划分为多个独立的界面,类似小型activity,也具有自己的生命周期和布局。

qq_52175613的博客 1187

Android Fragment 监听hide和show

setUserVisibleHint方法耳熟能详,可是仅仅适用于ViewPager,他是ViewPager中手动调用的,但是正常情况下我们该怎么监听呢?我们也手动调用不就好了上addFragment代码private Fragment mFragment; protected void addFragment(int frameLayoutId, Fragment fragment) { ...

qq_36523667的博客 2762

用Fragment的Hide()与Show()来代替Fragment的Replace()。

欢迎使用Markdown编辑器写博客本Markdown编辑器使用StackEdit修改而来,用它写博客,将会带来全新的体验哦: Markdown和扩展Markdown简洁的语法 代码块高亮 图片链接和图片上传 LaTex数学公式 UML序列图和流程图 离线写博客 导入导出Markdown文件 丰富的快捷键 快捷键 加粗 Ctrl + B 斜体 Ctrl + I 引用 Ctrl

qq_21893101的博客 871

android Fragment hide,show,replace等用法

摘要:本文系统解析了Android Fragment管理中add/hide/show和replace/remove的核心区别与使用场景。add/hide/show方案适合频繁切换的Tab页面(如底部导航),保持Fragment实例避免重复创建;而replace适合临时跳转场景,会销毁旧实例释放内存。文章通过对比表格、生命周期流程和典型示例,给出选择建议:多页面共存用hide/show,单页面流转用replace,并强调关键差异在于性能优化与内存管理的权衡。(149字)

琦琦的博客 495

Fragment 通过hide、show进行切换

版权声明:本文为延成原创文章,转载请标明出处 方法一: private Fragment preFragment; private FragmentTransaction switchFragment(Fragment targetFragment) { FragmentTransaction transaction = getSupportFragmentManager().beginTransaction(); if (!targetFragment.

延成的博客 1660
上一篇: Android 使用Jsoup解析HTML实现快速爬虫抓包
下一篇: Android BaseRecyclerViewAdapterHelper上拉加载更多
小红妹
博客等级 码龄10年 151粉丝 116原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值