当前位置: 首页 > news >正文

吴中快速建设网站价格地推项目发布平台

吴中快速建设网站价格,地推项目发布平台,wordpress插件doc,海南网站建设方面一个Activity中,在某一个容器中,更换不同的Fragment,从而显示不同的界面,这个场景相信大家已经非常熟悉了,也知道Activity是通过FragmentManager来管理嵌入的Fragments的,所以今天就来看看FragmentManager是…

一个Activity中,在某一个容器中,更换不同的Fragment,从而显示不同的界面,这个场景相信大家已经非常熟悉了,也知道Activity是通过FragmentManager来管理嵌入的Fragments的,所以今天就来看看FragmentManager是如何工作的。

我们以继承AppCompatActivity来分析。

我们常用的几种操作大致如下:

FragmentManager fragmentManager = getSupportFragmentManager();
Fragment f1 = new Fragment();
FragmentTransaction transaction = fragmentManager.beginTransaction();
transaction.add(f1,"tag");
transaction.hide(f1);
transaction.show(f1);
transaction.replace(R.id.layout1,f1);
transaction.remove(f1);

首先我们要获得FragmentManager对象实例。

FragmentManager fragmentManager = getSupportFragmentManager();

那我们就看看getSupportFragmentManager干了什么。

FragmentActivity.class@NonNullpublic FragmentManager getSupportFragmentManager() {return this.mFragments.getSupportFragmentManager();}

mFragments是 FragmentController 实例,声明时直接初始化final对象。

final FragmentController mFragments = FragmentController.createController(new HostCallbacks());

这了出现了一个HostCallbacks,继承自FragmentHostCallback,看看它的初始化。

public HostCallbacks() {super(FragmentActivity.this);
}基类构造如下:FragmentHostCallback(@NonNull FragmentActivity activity) {this(activity, activity, new Handler(), 0);}FragmentHostCallback(@Nullable Activity activity, @NonNull Context context, @NonNull Handler handler, int windowAnimations) {
//实际执行操作的是FragmentManagerImpl实例this.mFragmentManager = new FragmentManagerImpl();this.mActivity = activity;this.mContext = (Context)Preconditions.checkNotNull(context, "context == null");
//handler,后面会用到this.mHandler = (Handler)Preconditions.checkNotNull(handler, "handler == null");this.mWindowAnimations = windowAnimations;}

重点是FragmentManagerImpl,具体的操作都交给了FragmentManagerImpl对象。

再回到FragmentController.createController,通过传递HostCallbacks参数,将对属性mHost赋值。

    private FragmentController(FragmentHostCallback<?> callbacks) {this.mHost = callbacks;}

这样的话,FragmentController mFragments就初始化完成。回过头来再看getSupportFragmentManager的过程

//FragmentActivity.classpublic FragmentManager getSupportFragmentManager() {//调用FragmentController的getSupportFragmentManagerreturn this.mFragments.getSupportFragmentManager();}//FragmentController.class@NonNullpublic FragmentManager getSupportFragmentManager() {//返回mHost(FragmentHostCallback)中的FragmentManagerImpl对象return this.mHost.mFragmentManager;}

所以下面这句话拿到的就是FragmentManagerImpl实例。

FragmentManager fragmentManager = getSupportFragmentManager();

拿到fragmengManager后,接着开启一个事务FragmentTransaction。

FragmentTransaction transaction = fragmentManager.beginTransaction();

调用下面接口:

//FragmentManagerImpl.class@NonNullpublic FragmentTransaction beginTransaction() {return new BackStackRecord(this);}

 我们看到了一个新的类BackStackRecord,看名字大概是回退栈的意思,它继承自FragmentTransaction,它记录了Fragment的索引等信息,每次beginTransaction都会产生一个BackStackRecord对象,BackStackRecord中持有了当前FragmentManagerImpl对象,操作Fragment的动作,都是由这里入口,然后再调用基类FragmentTransaction的方法,将每个动作都添加到Op对象中,比如下面:

transaction.hide
//BackStackRecord.java@NonNull@Overridepublic FragmentTransaction hide(@NonNull Fragment fragment) {if (fragment.mFragmentManager != null && fragment.mFragmentManager != mManager) {throw new IllegalStateException("Cannot hide Fragment attached to "+ "a different FragmentManager. Fragment " + fragment.toString() + " is already"+ " attached to a FragmentManager.");}return super.hide(fragment);}//FragmentTransaction.java@NonNullpublic FragmentTransaction hide(@NonNull Fragment fragment) {//添加Op到操作列表中addOp(new Op(OP_HIDE, fragment));return this;}

当添加完一系列的动作后,操作并没有生效,我们需要调用commit或者commitNow来提交事务,才能看到最终的结果。

commit不会立即执行,它会把事务放在队列里,会在线程下一次执行时进行操作。

//commit调用commitInternalint commitInternal(boolean allowStateLoss) {......mManager.enqueueAction(this, allowStateLoss);return mIndex;}

commitNow会立即执行事务。

//commitNow会调用FragmentManagerImpl的execSingleAction@Overridepublic void commitNow() {disallowAddToBackStack();mManager.execSingleAction(this, false);}

这样整个FragmentManager就开始工作了,后面我们会想想讲解每一种操作的具体源码。

http://www.hkea.cn/news/475455/

相关文章:

  • 做网站工作都包括什么企业网站搭建
  • 自己可以进行网站建设吗河北网站推广
  • 网站建设与管理论文seo整站怎么优化
  • 西安做网站收费价格网站流量监控
  • 福州网站制作有限公司南京疫情最新情况
  • 国外品牌设计网站天津疫情最新消息
  • 宁波有做网站的地方吗seo报价单
  • 深圳企业网站开发中国法律服务网app最新下载
  • 大连企业网站建站国外域名注册网站
  • 站长工具seo综合查询权重百度在线搜索
  • 伊犁网站建设评价怎样才能上百度
  • 房地产网站建设方案百度实名认证
  • 做外贸可以在哪些网站注册网络项目免费的资源网
  • 中国建设银行信用卡网站首页青岛关键词优化平台
  • 阿里云网站建设考试题目长沙网站推广服务公司
  • 甘肃建设项目审批权限网站俄罗斯搜索引擎yandex官网入口
  • 网站建设公司新员工培训ppt模板百度热门搜索排行榜
  • 仿魔客吧网站模板网址大全是ie浏览器吗
  • 网站产品后台界面怎么做湖南关键词排名推广
  • 网站数据每隔几秒切换怎么做的湖南百度seo排名点击软件
  • 网站制作先学什么百度新闻下载安装
  • 河南省网站建设哪家好免费观看行情软件网站进入
  • 粘合剂东莞网站建设体育热点新闻
  • 百度网站排名关键词整站优化培训网站建设
  • 网络平台代理seo外包 杭州
  • 东方头条网站源码免费推广软件工具
  • 北京网站建设公司分享网站改版注意事项流程优化四个方法
  • 案例学 网页设计与网站建设手机百度seo快速排名
  • 江门网站建设总部电话产品推广渠道有哪些
  • 网站建设全攻略站长之家ping检测