[Android开发]Fragment使用工厂模式和优化

Android 多Fragment共享数据的MVP模式实现 前言这里不在介绍MVP模式的概念。只讲一些自己开发中对MVP模式的体会,和一个Activity多个Fragment场景下MVP的应用,和需要注意的问题。注意问题【1】首先第一点,无论是什么模式,你都需要贯彻面向接口化编程的思想 ——–M, V,P三层之间都通过Interface实现依赖,这是实现解耦最简单的办法。【2】MVP的设计思想除了解耦意外,还要实现的一个目的是稳定和复用。(在V很容易变化的环 阅读详情

现在的应用框架基本都会用到Fragment+ViewPager。
在我们创建多个Fragment的时候,或许我们应该用工厂模式来降低程序的耦合性。

下面这段代码来自于一个ViewPaper的Adapter里面。

@Override
        public Fragment getItem(int position) {
            return FragmentFactory.createFragment(position);
        }

获取Fragment的时候我们可以创建一个工厂类,同时我们为了提升性能,应该利用一个Map,判断是否已经创建,如果创建则不再创建。

FragmentFactory.java

public class FragmentFactory {

    private static Map<Integer, Fragment> mFragments = new HashMap<Integer, Fragment>();


    public static Fragment createFragment(int position)
    {
        Fragment fragment = null;
        fragment = mFragments.get(position);  //在集合中取出来Fragment
        if(fragment == null)   //如果在集合中没有取出来,需要重新创建
        {
            if(position == 0)
            {
                fragment = new HomeFragment();
            }
            else if(position == 1)
            {
                fragment = new AppFragment();
            }
            else if(position == 2)
            {
                fragment = new GameFragment();
            }
            else if(position == 3)
            {
                fragment = new SubjectFragment();
            }
            else if(position == 1)
            {
                fragment = new CategoryFragment();
            }
            else if(position == 6)
            {
                fragment = new TopFragment();
            }
            if(fragment != null)
            {
                mFragments.put(position, fragment);
            }
        }
        return fragment;

    }
}
Kotlin: 解密 ‘companion object {}’ 在Android开发中的高效实践 本文深入解析Kotlin伴生对象(companion object)在Android开发中的核心应用。通过对比Java静态成员,详细阐述了如何利用伴生对象优雅封装Activity跳转、实现工厂模式、管理常量与工具方法,并介绍了@JvmStatic注解、接口实现等进阶技巧与性能注意事项,帮助开发者编写更简洁、安全且易于维护的代码。 阅读详情

相关推荐

Kotlin伴生对象实战:5个Android开发中companion object的高效用法

本文深入解析Kotlin伴生对象在Android开发中的5个高效实战用法,涵盖Activity/Fragment启动器封装、轻量级工具类构建、常量管理、工厂模式实现及Java互操作优化。通过companion object,开发者能编写出更地道、安全且易于维护的Kotlin代码,显著提升开发效率。

rock5的博客 210

Android Fragment的设计模式:工厂模式

一、概述:如果项目里有很多fragment,如果直接从各个菜单直接调用的话是不是显得很杂乱无章呢? 这时我们就得把相关有共性的fragment抽取出来,做成一个抽象类,封装好所有fragment的共有的方法 如果不是共有的方法,就做成抽象方法,由其实现的fragment去实现二、基类BaseFragment/** * @描述 fragment * @项目名称 App

lovoo的博客 3677

Android Fragment深度解析:从生命周期到通信与性能优化

在Android应用开发中,UI组件的模块化与复用是构建灵活、可维护界面的核心需求。Fragment作为Android架构的关键组件,其设计原理在于将Activity的界面逻辑拆分为独立、可复用的单元,每个Fragment拥有自己的生命周期和视图层次。这一机制的技术价值在于实现了UI的高度模块化,支持动态组合与替换,从而轻松适配不同屏幕尺寸(如手机与平板的布局差异),并优化了导航体验。通过FragmentManager和FragmentTransaction进行事务管理,结合后台栈支持,开发者能够构建流畅的

weixin_30315905的博客 456

工厂模式

工厂模式1. 工厂模式介绍1.1 工厂模式定义1.2 工厂模式的分类1.3 为什么要用工厂模式2. 简单工厂模式2.1 介绍2.2 适用场景2.3 简单工厂模式角色分配2.4 简单工厂实例2.5 使用反射机制改善简单工厂3. 工厂方法模式3.1 介绍3.2 适用场景3.3 工厂方法模式角色分配:3.4 工厂方法模式实例4. 抽象工厂模式4.1 介绍4.2 适用场景4.3 抽象工厂方法模式角色分配:4.4 抽象工厂的工厂和工厂方法中的工厂有什么区别4.5 抽象工厂模式实例 1. 工厂模式介绍 1.1 工厂模式

wang_zhao_的博客 280

设计模式在android中的应用之1,简单工厂模式

简单工厂模式在android中的应用。简单工厂模式相信大家都懂了。但是我觉得理论知识缺乏应用永远显得苍白无力。于是贴出了这一系列代码。都是关于设计模式在android中的简单应用。

Android工厂模式简单实现demo(含注释)

Android工厂模式简单实现demo(含注释),同步博文:http://blog.youkuaiyun.com/qq_28690547/article/details/50660376

android设计模式之工厂模式

    工厂方法模式,是创建型设计模式之一。工厂方法模式是一种结构简单的模式,在我们平时开发中应用广泛。Android中的activity里的各个生命周期方法,以onCreate为例,它就可以看做是一个工厂方法,我们可以在其中构造我们的View并通过setContentView返回给framework处理。   工厂方法模式的定义 定义一个创建对象的接口,让子类决定实例化哪个类。   ...

且听真言 3780

腾讯云CodeBuddy+微信小程序:5分钟开发番茄小闹钟

番茄钟是一种简单的时间管理方法。这个方法很简单:你专注工作25分钟,然后休息5分钟。这样可以让你更专心,不容易分心,还能防止过度疲劳。 很多人用番茄钟来提高工作效率,因为它能帮助你更好地管理时间。不过,市面上的一些免费番茄钟应用常常会有广告弹出来,影响使用体验。这就是为什么我们要开发一个没有广告的番茄钟小程序,让用户可以专心工作,不被打扰。

2201_75366661的博客 1689

Android 工厂模式,三种工厂模式的理解

工厂模式是一种创建者模式,在任何生成复杂对象的地方都可以使用工厂模式。理论来说在任何使用A a = new A()的方式都可以使用工厂模式,虽然使用工厂模式可能需要多做一些工作,但是在后续的开发和维护都带来了方便。如果我们需要在构建对象的时候,需要做很多的处理工作,比如初始化工作,查询工作等一些耗时的工作,如果我们将这些操作全部放入到构造方法中去写,那么势必在后期维护的带来不方便

Rrtoyewx 2万+

如何用谷歌插件Apollo.io高效开发客户?手把手教你避开常见坑点

本文详细介绍了如何利用谷歌插件Apollo.io高效开发外贸客户,包括核心功能解析、免费额度最大化利用策略、多插件协同技巧以及常见陷阱规避方法。通过Apollo.io的智能匹配算法和庞大数据库,外贸从业者可以精准锁定目标客户,提升开发效率。

banana的博客 885

MobaXterm结合SSH密钥对安全连接阿里云ECS的实战教程

本文详细介绍了如何使用MobaXterm结合SSH密钥对安全连接阿里云ECS的实战教程。通过对比传统密码登录的风险,重点讲解了密钥对的生成与配置、阿里云控制台的密钥绑定技巧,以及MobaXterm的高级设置和故障排查方法,帮助用户实现高效、安全的远程连接。

weixin_29208327的博客 466

Android常用设计模式-工厂模式

工厂模式是Java中最常用的创建型设计模式之一,主要用于封装对象(解耦)的创建过程,使代码更加灵活和可维护。Java中主要有三种工厂模式:

maoning20080808的专栏 751

别再只用串口助手了!用LabVIEW给STM32F103C8T6做个专属上位机(附完整源码)

本文详细介绍了如何利用LabVIEW为STM32F103C8T6开发定制化上位机,替代传统串口助手,实现高效数据交互。内容涵盖硬件架构设计、STM32固件优化、LabVIEW上位机开发技巧及工业级应用案例,特别适合需要实时数据采集与处理的工控场景。

weixin_42524762的博客 366

android之工厂模式回顾

简单介绍:new操作是实例化对象,工厂实例化对象意味着大批量,当然这里的大批量指的是好几个,一些功能类似的类,将其进行抽象,使用公共父类或借口或抽象类来提取共有特性。工厂模式分了简单工厂和抽象工厂,我们在不知不觉中会用到的也是经常用到是简单工厂:通过参数来创建不同的对象。在文章最后附上DEMO,比较简单的一个demo示例:是工厂设计模式、Tab页面以及MD控件TabLayout结合的实现说明,具体...

lizhong 790

MATLAB实战:手把手教你绘制发动机万有特性曲线(附完整代码)

本文提供了一份详细的MATLAB实战指南,手把手教你从发动机台架试验数据出发,通过数据预处理、核心插值算法和可视化技巧,绘制出专业、精确的发动机万有特性曲线图。文章深入解析了万有特性图的核心构成与工程意义,并附带了完整的模块化代码,帮助工程师和学生快速掌握这一关键技能。

weixin_29094539的博客 410

MATLAB控制信号发生器(USB-GPIB-HS)GPIB仪器控制教程(含matlab代码)

自动化测试时需要自动产生信号,通过matlab控制信号发生器的频率与功率,以实现自动化信号生成输出

qq_43686057的博客 1606

android开发中Factory简单工厂模式的实际使用

工厂模式顾名思义就是用工厂来生产具体的产品。可以根据是具体产品还是具体工厂分为简单工厂模式和 工厂方法模式,根据工厂是否为抽象 可以分为抽象工厂模式和工厂方法模式。 简单工厂模式就是一家工厂根据给定的(传入的)不同的材料(参数)生产出具体不同种类的产品。如图所示: 下面看实际运用的代码再来具体解释: import android.util.SparseArray; import androi...

weixin_43853376的博客 808

content-pipeline:一条可落地的内容生产流水线

content-pipeline 是一种将内容创作工程化的系统性方法,其核心在于用确定性流程替代碎片化人工操作。它基于结构化提示(prompt)、预置叙事框架与品牌参数固化三大原理,实现从素材输入到多平台发布的端到端自动化。技术价值体现在显著降低认知负荷、保障输出一致性、支持本地化资源绑定与闭环反馈校验。典型应用场景包括技术教程批量生成、跨平台(公众号/小红书/即刻)内容适配、AI写作质量可控迭代等。本文深入解析其作为‘内容制造业’基础设施的底层设计逻辑与实操路径,尤其聚焦Claude Code环境下的真实

weixin_31199559的博客 267

flutterpageview卡顿,android开发文档百度云

具有一定的分层,model彻底解耦,controller和view并没有解耦层与层之间的交互尽量使用回调或者去使用消息机制去完成,尽量避免直接持有 controller和view在android中无法做到彻底分离,但在代码逻辑层面一定要分清业务逻辑被放置在model层,能够更好的复用和修改增加业务。

2401_84411939的博客 422

银河麒麟V10等保加固清单:安全基线配置一篇搞定(附逐项检查表)

通过限制使用SSH直接以root身份登录,禁用公钥登录的方式加强SSH服务的安全性。更改SSH默认端口可在一定程度上防止被黑客使用大批量扫描方式攻击。通过修改SSH的配置文件限制可以使用SSH服务远程管理的主机。

信创运维工程师 · 银河麒麟 & 容器实战 | 金融生产环境迁移·等保加固 | 142篇原创·17万+阅读 817

深度学习工具包 DeepLearningToolbox

深度学习工具包Deprecation notice.-----This toolbox is outdated and no longer maintained.There are much better tools available for deep learning than this toolbox, e.g. [Theano](http://deeplearning.net/software/theano/), [torch](http://torch.ch/) or [tensorflow](http://www.tensorflow.org/)I would suggest you use one of the tools mentioned above rather than use this toolbox.Best, Rasmus.DeepLearnToolbox================A Matlab toolbox for Deep Learning.Deep Learning is a new subfield of machine learning that focuses on learning deep hierarchical models of data.It is inspired by the human brain's apparent deep (layered, hierarchical) architecture.A good overview of the theory of Deep Learning theory is[Learning Deep Architectures for AI](http://www.iro.umontreal.ca/~bengioy/papers/ftml_book.pdf)For a more informal introduction, see the following videos by Geoffrey Hinton and Andrew Ng.* [The Next Generation of Neural Networks](http://www.youtube.com/watch?v=AyzOUbkUf3M) (Hinton, 2007)* [Recent Developments in Deep Learning](http://www.youtube.com/watch?v=VdIURAu1-aU) (Hinton, 2010)* [Unsupervised Feature Learning and Deep Learning](http://www.youtube.com/watch?v=ZmNOAtZIgIk) (Ng, 2011)If you use this toolbox in your research please cite [Prediction as a candidate for learning deep hierarchical models of data](http://www2.imm.dtu.dk/pubdb/views/publication_details.php?id=6284)```@MASTERSTHESIS\{IMM2012-06284, author = "R. B. Palm", title = "Prediction as a candidate for learning deep hierarchical models of data", year = "2012",}```Contact: rasmusbergpalm at gmail dot comDirectories included in the toolbox-----------------------------------`NN/` - A library for Feedforward Backpropagation Neural Networks`CNN/` - A library for Convolutional Neural Networks`DBN/` - A library for Deep Belief Networks`SAE/` - A library for Stacked Auto-Encoders`CAE/` - A library for Convolutional Auto-Encoders`util/` - Utility functions used by the libraries`data/` - Data used by the examples`tests/` - unit tests to verify toolbox is workingFor references on each library check REFS.mdSetup-----1. Download.2. addpath(genpath('DeepLearnToolbox'));Example: Deep Belief Network---------------------```matlabfunction test_example_DBNload mnist_uint8;train_x = double(train_x) / 255;test_x = double(test_x) / 255;train_y = double(train_y);test_y = double(test_y);%% ex1 train a 100 hidden unit RBM and visualize its weightsrand('state',0)dbn.sizes = [100];opts.numepochs = 1;opts.batchsize = 100;opts.momentum = 0;opts.alpha = 1;dbn = dbnsetup(dbn, train_x, opts);dbn = dbntrain(dbn, train_x, opts);figure; visualize(dbn.rbm{1}.W'); % Visualize the RBM weights%% ex2 train a 100-100 hidden unit DBN and use its weights to initialize a NNrand('state',0)%train dbndbn.sizes = [100 100];opts.numepochs = 1;opts.batchsize = 100;opts.momentum = 0;opts.alpha = 1;dbn = dbnsetup(dbn, train_x, opts);dbn = dbntrain(dbn, train_x, opts);%unfold dbn to nnnn = dbnunfoldtonn(dbn, 10);nn.activation_function = 'sigm';%train nnopts.numepochs = 1;opts.batchsize = 100;nn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.10, 'Too big error');```Example: Stacked Auto-Encoders---------------------```matlabfunction test_example_SAEload mnist_uint8;train_x = double(train_x)/255;test_x = double(test_x)/255;train_y = double(train_y);test_y = double(test_y);%% ex1 train a 100 hidden unit SDAE and use it to initialize a FFNN% Setup and train a stacked denoising autoencoder (SDAE)rand('state',0)sae = saesetup([784 100]);sae.ae{1}.activation_function = 'sigm';sae.ae{1}.learningRate = 1;sae.ae{1}.inputZeroMaskedFraction = 0.5;opts.numepochs = 1;opts.batchsize = 100;sae = saetrain(sae, train_x, opts);visualize(sae.ae{1}.W{1}(:,2:end)')% Use the SDAE to initialize a FFNNnn = nnsetup([784 100 10]);nn.activation_function = 'sigm';nn.learningRate = 1;nn.W{1} = sae.ae{1}.W{1};% Train the FFNNopts.numepochs = 1;opts.batchsize = 100;nn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.16, 'Too big error');```Example: Convolutional Neural Nets---------------------```matlabfunction test_example_CNNload mnist_uint8;train_x = double(reshape(train_x',28,28,60000))/255;test_x = double(reshape(test_x',28,28,10000))/255;train_y = double(train_y');test_y = double(test_y');%% ex1 Train a 6c-2s-12c-2s Convolutional neural network %will run 1 epoch in about 200 second and get around 11% error. %With 100 epochs you'll get around 1.2% errorrand('state',0)cnn.layers = { struct('type', 'i') %input layer struct('type', 'c', 'outputmaps', 6, 'kernelsize', 5) %convolution layer struct('type', 's', 'scale', 2) %sub sampling layer struct('type', 'c', 'outputmaps', 12, 'kernelsize', 5) %convolution layer struct('type', 's', 'scale', 2) %subsampling layer};cnn = cnnsetup(cnn, train_x, train_y);opts.alpha = 1;opts.batchsize = 50;opts.numepochs = 1;cnn = cnntrain(cnn, train_x, train_y, opts);[er, bad] = cnntest(cnn, test_x, test_y);%plot mean squared errorfigure; plot(cnn.rL);assert(er<0.12, 'Too big error');```Example: Neural Networks---------------------```matlabfunction test_example_NNload mnist_uint8;train_x = double(train_x) / 255;test_x = double(test_x) / 255;train_y = double(train_y);test_y = double(test_y);% normalize[train_x, mu, sigma] = zscore(train_x);test_x = normalize(test_x, mu, sigma);%% ex1 vanilla neural netrand('state',0)nn = nnsetup([784 100 10]);opts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samples[nn, L] = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.08, 'Too big error');%% ex2 neural net with L2 weight decayrand('state',0)nn = nnsetup([784 100 10]);nn.weightPenaltyL2 = 1e-4; % L2 weight decayopts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samplesnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex3 neural net with dropoutrand('state',0)nn = nnsetup([784 100 10]);nn.dropoutFraction = 0.5; % Dropout fraction opts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samplesnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex4 neural net with sigmoid activation functionrand('state',0)nn = nnsetup([784 100 10]);nn.activation_function = 'sigm'; % Sigmoid activation functionnn.learningRate = 1; % Sigm require a lower learning rateopts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samplesnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex5 plotting functionalityrand('state',0)nn = nnsetup([784 20 10]);opts.numepochs = 5; % Number of full sweeps through datann.output = 'softmax'; % use softmax outputopts.batchsize = 1000; % Take a mean gradient step over this many samplesopts.plot = 1; % enable plottingnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex6 neural net with sigmoid activation and plotting of validation and training error% split training data into training and validation datavx = train_x(1:10000,:);tx = train_x(10001:end,:);vy = train_y(1:10000,:);ty = train_y(10001:end,:);rand('state',0)nn = nnsetup([784 20 10]); nn.output = 'softmax'; % use softmax outputopts.numepochs = 5; % Number of full sweeps through dataopts.batchsize = 1000; % Take a mean gradient step over this many samplesopts.plot = 1; % enable plottingnn = nntrain(nn, tx, ty, opts, vx, vy); % nntrain takes validation set as last two arguments (optionally)[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');```[![Bitdeli Badge](https://d2weczhvl823v0.cloudfront.net/rasmusbergpalm/deeplearntoolbox/trend.png)](https://bitdeli.com/free "Bitdeli Badge")

【译】使用newInstance()来实例化fragment

我最近读到StackOverflow上面关于Fragment实例化的一个问题,觉得挺有趣的。 new MyFragment()和MyFragment.newInstance()之间的差别是什么?应该用哪个呢? 好问题。答案就是这篇文章的题目所建议的,这是一种合理的设计。在这种情况下,newInstance()方法是一种“静态工厂方法",让我们在初始化和设置一个新的fragment的时候...

weixin_30664539的博客 64

jre9下载 jdk9

(Java SE Runtime Environment 9.0) 9.0u175 官方最新版 【x86|x64】

ZMY_工厂模式

package frgment_s; import java.util.HashMap; import android.support.v4.app.Fragment; public class Fractorys {     private static HashMap hashMap;     public  Fragment setfractorys(int p

Miss_ZM的博客 356

霍尼韦尔SoftMaster使用说明

霍尼韦尔SoftMaster使用说明

NTscan扫描工具

ntscan是一个扫描器,可以扫描没有密码和弱密码的共享,先到配置文件中填写猜测的用户名和密码,扫描过程中右侧出现的是扫描日志。

设计模式之工厂模式(Factory)在Android中的应用

1.工厂模式也是我们最常见的一种模式了,可以用来创建多个不同的实例对象。Android代码中最常见的应该是对Fragment的集中管理了。用Fragment工厂,创建出不同的fragment。 2.eg: 现在的app大多数都是由少数几个activity和众多的fragment组成,那么针对这些fragment,我们可以开辟一个工厂,针对不同的需求生产不同的fragment,如下就是典型的工厂模

huang_xiao_yu的博客 1919

安卓开发用到的设计模式(1)创建型模式

本文介绍了在Android开发中常用的创建型设计模式及其应用场景。单例模式用于确保类只有一个实例,如系统服务和数据管理器;工厂模式通过隐藏创建逻辑来简化对象创建,如Fragment和IntentService的实例化;抽象工厂模式用于创建一系列相关对象,如主题系统和数据访问层;建造者模式通过分离构建过程与表示来创建复杂对象,如Dialog和Retrofit的配置;原型模式通过复制原型实例来创建新对象,如Intent的克隆和配置对象的复制。

分享Android应用和系统开发、音视频编码、性能优化相关知识 1404

Android Fragment开发指南:从基础到高级实践

Fragment作为Android UI开发的核心组件,通过模块化设计实现了界面元素的灵活组合与复用。其生命周期与Activity深度绑定,支持动态加载和事务管理,为构建响应式布局提供了基础架构。在工程实践中,Fragment常用于实现多窗格布局、ViewPager分页等场景,结合ViewModel和LiveData可实现高效的状态管理。随着Jetpack组件的发展,现代Android开发中Fragment与Navigation组件、Compose的整合成为趋势,同时需要注意内存泄漏和生命周期等常见问题。掌

weixin_33924220的博客 422

Android Fragment核心原理与最佳实践指南

Fragment作为Android UI组件化的核心技术,通过模块化设计实现界面复用与灵活组合。其核心原理在于独立生命周期管理与宿主依赖机制,既保持UI单元的自治性,又能与Activity协同工作。这种架构显著提升了应用在多屏幕适配和复杂交互场景下的开发效率,是构建现代化Android应用的基石。通过ViewModel实现数据共享、结合Navigation组件管理页面流转,Fragment在Jetpack生态中展现出强大的技术价值。本文深入解析Fragment的生命周期联动机制,提供参数传递、事务管理等工程

weixin_34236869的博客 396
上一篇: [Android开发]屏幕适配问题
下一篇: [Android知识点]基础复习
陶程
博客等级 码龄12年 360粉丝 56原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值