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

政府部门网站建设简讯/黑河seo

政府部门网站建设简讯,黑河seo,外贸功能网站建设,建筑设计软件哪个好用对于做Android App的小伙伴来说setContentView这个方法再熟悉不过了,那么有多少小伙伴知道它的调用到底做了多少事情呢?下面就让我们来看看它背后的故事吧? setContentView()方法将分为两节来讲:   第一节:如何获取De…

  对于做Android App的小伙伴来说setContentView这个方法再熟悉不过了,那么有多少小伙伴知道它的调用到底做了多少事情呢?下面就让我们来看看它背后的故事吧?

  setContentView()方法将分为两节来讲:
  第一节:如何获取DecorView和contentParent
  第二节:如何将R.layout.activity_main.xml的布局渲染到contentParent中

  这节先来讲如何获取DecorView和contentParent
  我们新建一个Activity时,onCreate()方法中就会自动调用setContentView()方法

    @Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_main);}

  这里看着是setContentView方法将我们自己写的R.layout.activity_main的布局文件传下去,其实这里这后边还是做了很多事情的。

这里需要分两种情况
一:MainActivity继承于Activity
二:MainAcitivity继承于AppCompatActivity

第一种情况:MainActivity继承于Activity

1.执行setContentView(R.layout.activity_main)方法后会进入到Activity.java的setContentView方法中

 public void setContentView(@LayoutRes int layoutResID) {getWindow().setContentView(layoutResID);initWindowDecorActionBar();}

可以看到会调用getWindow().setContentView(layoutResID);,这个getWindow()是获取的其实就是phoneWindow
2.执行phoneWindow的setContentView方法

  @Overridepublic void setContentView(int layoutResID) {// Note: FEATURE_CONTENT_TRANSITIONS may be set in the process of installing the window// decor, when theme attributes and the like are crystalized. Do not check the feature// before this happens.if (mContentParent == null) {//创建DecorView,得到mContentParent installDecor();} else if (!hasFeature(FEATURE_CONTENT_TRANSITIONS)) {mContentParent.removeAllViews();}if (hasFeature(FEATURE_CONTENT_TRANSITIONS)) {final Scene newScene = Scene.getSceneForLayout(mContentParent, layoutResID,getContext());transitionTo(newScene);} else {//将我们传入的R.layout.activity_main.xml渲染到mContentParentmLayoutInflater.inflate(layoutResID, mContentParent);}mContentParent.requestApplyInsets();final Callback cb = getCallback();if (cb != null && !isDestroyed()) {cb.onContentChanged();}mContentParentExplicitlySet = true;}

我们可以看到这里做了两件事情
(1)执行installDecor();创建出DecorView和拿到contentParent

   private void installDecor() {mForceDecorInstall = false;if (mDecor == null) {//当mDecor == null时调用generateDecor创建一个DecorViewmDecor = generateDecor(-1);....//省略代码} else {//当mDecor != null时将这个phoneWindow传个mDecormDecor.setWindow(this);}if (mContentParent == null) {mContentParent = generateLayout(mDecor);....//省略代码}}}

1)执行mDecor = generateDecor(-1);方法

    protected DecorView generateDecor(int featureId) {...//省略代码,这里创建了一个DecorViewreturn new DecorView(context, featureId, this, getAttributes());}

到这里已经创建除了DecorView
2)执行mContentParent = generateLayout(mDecor);方法

    protected ViewGroup generateLayout(DecorView decor) {// Apply data from current theme.TypedArray a = getWindowStyle();...//省略代码} else {// Embedded, so no decoration is needed.//这里我们就以R.layout.screen_simple为例layoutResource = R.layout.screen_simple;// System.out.println("Simple!");}mDecor.startChanging();//将R.layout.screen_simple.xml添加到DecorView中mDecor.onResourcesLoaded(mLayoutInflater, layoutResource);//拿到contentParent  com.android.internal.R.id.contentViewGroup contentParent = (ViewGroup)findViewById(ID_ANDROID_CONTENT);if (contentParent == null) {throw new RuntimeException("Window couldn't find content container view");}...//省略代码mDecor.finishChanging();return contentParent;}

  通过设置的属性和创建的Activity的类型会选择一个对应的layoutResource,再通过onResourcesLoaded()方法将选择的layoutResource以addView()的方式添加到创建的DecorView中去,最后执行contentParent = (ViewGroup)findViewById(ID_ANDROID_CONTENT);拿到contentParent,到这一步就会得到下图的窗口布局
在这里插入图片描述

第二种情况:MainAcitivity继承于AppCompatActivity

1.执行setContentView(R.layout.activity_main)方法后会进入到AppCompatActivity.java中的setContentView

 @Overridepublic void setContentView(@LayoutRes int layoutResID) {getDelegate().setContentView(layoutResID);}

getDelegate()方法中会调用AppCompatDelegate.create(this, this)后new了一个
AppCompatDelegateImpl

  @NonNullpublic static AppCompatDelegate create(@NonNull Activity activity,@Nullable AppCompatCallback callback) {return new AppCompatDelegateImpl(activity, callback);}

所以这里会走到AppCompatDelegateImpl.java中的setContentView()方法

    @Overridepublic void setContentView(int resId) {//创建DecorView,并创建一个subDecorensureSubDecor();ViewGroup contentParent = mSubDecor.findViewById(android.R.id.content);contentParent.removeAllViews();LayoutInflater.from(mContext).inflate(resId, contentParent);mAppCompatWindowCallback.getWrapped().onContentChanged();}

1.执行ensureSubDecor();

  private void ensureSubDecor() {if (!mSubDecorInstalled) {//	创建一个subDecormSubDecor = createSubDecor();...//省略代码}}
private ViewGroup createSubDecor() {// Now let's make sure that the Window has installed its decor by retrieving it//确保已经拿到了phoneWinow,其实早在AppCompatAcitivy的onCreate()方法中就拿到了phoneWindowensureWindow();//这一步其实就是创建了DeocrView和拿到了contentParentmWindow.getDecorView();...//省略代码if (!mWindowNoTitle) {...//省略代码} else if (mHasActionBar) {...//省略代码} else {if (mOverlayActionMode) {...//省略代码} else {//上边省略的代码就是通过各种设置的判断最后为subDecor找了一个xml//这里就以最简单R.layout.abc_screen_simple.xml为例吧subDecor = (ViewGroup) inflater.inflate(R.layout.abc_screen_simple, null);}...//省略代码//contentView是拿到了R.layout.abc_screen_simple.xml中的R.id.action_bar_activity_contentfinal ContentFrameLayout contentView = (ContentFrameLayout) subDecor.findViewById(R.id.action_bar_activity_content);//windowContentView 是拿到了R.layout.screen_simple.xml中的android.R.id.contentfinal ViewGroup windowContentView = (ViewGroup) mWindow.findViewById(android.R.id.content);if (windowContentView != null) {// There might be Views already added to the Window's content view so we need to// migrate them to our content view//这个while循环的是将windowContentView 中已经添加的View全部移除,然后添加到contentView 中while (windowContentView.getChildCount() > 0) {final View child = windowContentView.getChildAt(0);windowContentView.removeViewAt(0);contentView.addView(child);}// Change our content FrameLayout to use the android.R.id.content id.// Useful for fragments.//这里将R.layout.screen_simple.xml中content的id设置为NO_IDwindowContentView.setId(View.NO_ID);//这里将R.layout.abc_screen_simple.xml中的R.id.action_bar_activity_content设置为android.R.id.contentcontentView.setId(android.R.id.content)// Now set the Window's content view with the decor//将subDecor放入到phonewWinow中mWindow.setContentView(subDecor);...//省略代码//返回subDecorreturn subDecor;}

我们以图的方式来讲解上边的各种操作吧
(1) 执行mWindow.getDecorView();之后会构建出下图
在这里插入图片描述
(2)执行 subDecor = (ViewGroup) inflater.inflate(R.layout.abc_screen_simple, null);之后,mSubDecor如下图
在这里插入图片描述(3)执行完 windowContentView.setId(View.NO_ID);
![在这里插入图片描述](https://img-blog.csdnimg.cn/983dfcb10f084b80a7e88cc3cdf32f02.png
(4)执行 contentView.setId(android.R.id.content);
在这里插入图片描述(5)执行mWindow.setContentView(subDecor);
在这里插入图片描述
2.执行 ViewGroup contentParent = mSubDecor.findViewById(android.R.id.content);通过创建的mSubDecor拿到了android.R.id.content

  至此,已经拿到了DecorView和contentParent,下一步就是将R.layout.activity_main.xml渲染到contentParent,我们将会在下一节中讲解。

相关文章:

Android setContentView流程分析(一)

对于做Android App的小伙伴来说setContentView这个方法再熟悉不过了,那么有多少小伙伴知道它的调用到底做了多少事情呢?下面就让我们来看看它背后的故事吧? setContentView()方法将分为两节来讲:   第一节:如何获取De…...

doris数据库操作数字遇到的问题

关于doris数据库Apache Doris 是一个基于 MPP 架构的高性能、实时的分析型数据库,以极速易用的特点被人们所熟知,仅需亚秒级响应时间即可返回海量数据下的查询结果,不仅可以支持高并发的点查询场景,也能支持高吞吐的复杂分析场景。…...

3.13文件的IO操作

一.文件1.定义文件一般指的是存储在硬盘上的普通文件形如:txt.jpg.mp4,rar等这些文件在计算机中,文件可能是一个广义的概念,不仅可以包含普通文件,还可以包含目录(也就是文件夹.把目录称为目录文件)在操作系统中,还会用文件来描述一些其他的硬件设备或者软件资源比如网卡,显示器…...

ffmpeg使用

1 下载FFmpeg安装 官网地址:https://www.ffmpeg.org/download.html#build-windows 进入网址,点击下面红框部分 点击下面范围进行下载,下载速度有点慢,等等吧! 下载成功后,解压后,复制bin的路…...

spark中的并行度(分区数)/分区器如何确定

源头RDD有自己的分区计算逻辑,一般没有分区器,并行度是根据分区算法自动计算的,RDD的compute函数中记录了数据如何而来,如何分区的hadoopRDD,根据XxxinputFormat.getInputSplits()来决定,比如默认的TextInputFormat将文…...

00后女生“云摆摊”两周赚1.5万,实体店转战线上真的能赚钱吗?

最近,山东临沂的00后女生利用小程序在线上“云摆摊”卖水果,两周赚1.5万,引发网友热议。不少人发出质疑的声音:年轻人不要有稳定的工作不做,去摆摊;网上开店成本低,开实体店结果就难说了&#x…...

华为OD机试题 - 最优资源分配(JavaScript)| 机考必刷

更多题库,搜索引擎搜 梦想橡皮擦华为OD 👑👑👑 更多华为OD题库,搜 梦想橡皮擦 华为OD 👑👑👑 更多华为机考题库,搜 梦想橡皮擦华为OD 👑👑👑 华为OD机试题 最近更新的博客使用说明本篇题解:最优资源分配题目输入输出描述备注示例一输入输出说明示例二输入…...

利用python判断字符串是否为回文

1 问题 如何用python判断字符串是否为回文。 2 方法 用两个变量left,right模仿指针(一个指向第一个字符,一个指向最后一个字符),每比对成功一次,left向右移动一位,right向左移动一位&#xff0c…...

GDB 调用之ptype、set variable

今天在公司的时候,排查一个问题,创建l3 lif 失败,查看各种日志发现是用key去创建的 lif失败了,日志里指示key为空,导致的创建失败。原因为一个结构体比基线的多了一些东西,导致版本不对,既而计算…...

并发编程---阻塞队列(五)

阻塞队列一 阻塞队列1.1.阻塞队列概念1.2.阻塞队列API案例1.2.1. ArrayBlockingQueue1.2.1.1.抛出异常1.2.1.2.返回布尔1.2.1.3.阻塞1.2.1.4.超时1.2.2.SynchronousQueue二 阻塞队列应用---生产者消费者2.1.传统模式案例代码结果案例问题---防止虚假唤醒2.2.⽣产者消费者防⽌虚…...

本科课程【计算机组成原理】实验1 - 输出ABCD程序的生成

大家好,我是【1+1=王】, 热爱java的计算机(人工智能)渣硕研究生在读。 如果你也对java、人工智能等技术感兴趣,欢迎关注,抱团交流进大厂!!! Good better best, never let it rest, until good is better, and better best. 近期会把自己本科阶段的一些课程设计、实验报…...

Java并发编程(2) —— 线程创建的方式与原理

一、Java线程创建的三种方式 1. 继承Thread类并重写run()方法 ///方法一:使用匿名内部类重写Thread的run()方法Thread t1 new Thread() {Overridepublic void run() {try {sleep(10000);} catch (InterruptedException e) {e.printStackTrace();}log.debug("…...

你写的js性能有多差你知道吗 | js性能优化

性能的计算⽅式 确认⾃⼰需要关注的指标 常⻅的指标有: ⻚⾯总加载时间 load⾸屏时间⽩屏时间 代码 尝试⽤⼀个指令, 挂载在重要元素上, 当此元素inserted就上报 各个属性所代表的含义 connectStart, connectEnd 分别代表TCP建⽴连接和连接成功的时间节点。如果浏…...

线程的状态、状态之间的相互转换

目录 一、线程的状态 1. NEW 2. TERMINATED 3. RUNNABLE 4. TIMED_WAITING 5. BLOCKED 6. WAITING 二、线程状态转换 1. 线程状态转换简图 一、线程的状态 线程的状态一共有 6 种: NEW:安排了工作,还未开始行动(调用 st…...

Java8使用Lambda表达式(流式)快速实现List转map 、分组、过滤等操作

利用java8新特性,可以用简洁高效的代码来实现一些数据处理。1 数据准备1.1 定义1个Fruit对象package com.wkf.workrecord.work;import org.junit.Test;import java.math.BigDecimal; import java.util.ArrayList; import java.util.List;/*** author wuKeFan* date …...

C++之深浅拷贝

一、浅拷贝 我们看下以下代码 Test.h 文件 #pragma once #include<iostream> using namespace std; class Student { public:Student(){}~Student(){if (m_Id ! nullptr){delete m_Id;m_Id nullptr;}}Student(int id, string strName){m_Id new int[id];m_strName s…...

CoreLocation的一切

Overview 概述 [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-pgnvehxf-1678717852996)(./blog_cover.png)] Core Location 提供的服务可以确定设备的地理位置、高度和方向&#xff0c;或者它相对于附近 iBeacon 设备的位置。 该框架使用设备上的所…...

HashMap原理

初始化 从HashMap 源码中我们可以发现&#xff0c;HashMap的初始化有一下四种方式 //HashMap默认的初始容量大小 16&#xff0c;容量必须是2的幂 static final int DEFAULT_INITIAL_CAPACITY 1 << 4; // HashMap最大容量 static final int MAXIMUM_CAPACITY 1 <&…...

STM32入门笔记(02):独立看门狗(IWDG)和窗户看门狗(WWDG)(SPL库函数版)

1.IWDG狗简介 除了始终控制器的RCC_CSR寄存器的父为标志位和备份区域中的寄存器以外&#xff0c;系统复位 将复位所有寄存器至它们的复位状态。 当发生以下任一事件时&#xff0c;产生一个系统复位&#xff1a; 1.NRST引脚上的 低 电平&#xff0c;即 外部复位&#xff1b;2…...

javaSE系列之方法与数组的使用

[TOC] javaSE系列之方法与数组的使用 方法的定义 方法类似于C语言中的"函数"。 方法的种类 这里方法分为有参方法也分为无参方法&#xff0c; 形参和实参是两个实体&#xff08;这里相当于函数的传值调用和传址调用&#xff09; 1.非静态方法&#xff1a;普通方法/…...

常用命令总结

将常用命令汇集于此&#xff0c;以便在忘记的时候查询&#xff0c;持续更新…… Git Local changes 添加名字&#xff1a; git config --global user.name "<你的名字>"添加邮件&#xff1a; git config --globa user.email "<你的邮箱>"…...

【Linux:程序地址空间--原来操作系统也喜欢画大饼】

目录 1 代码感受 2 进程地址空间 3 扩展 1 代码感受 在正式讲程序地址空间前我们先来看一段简单的代码来分析分析&#xff1a; 1 #include<iostream>2 #include<unistd.h>3 using namespace std;4 5 int g_val100;6 7 int main()8 {9 pid_t idfork();10 if(i…...

Python实现简单信号滤波实战

在有些项目中需要对信号进行滤波处理&#xff0c;尤其是在医疗的设备中如心跳、脉搏等设备的采样后进行处理。滤波的目的就是除去某些频率的信号如噪声。常见的包括有低通滤波、高通滤波、带通滤波。 低通滤波指的是去除高于某一阈值频率的信号&#xff1b;高通滤波去除低于某…...

Java(110):非对称加密RSA的使用(KeyPair生成密钥)

Java(110)&#xff1a;非对称加密RSA的使用(KeyPair生成密钥) RSA 算法是一种非对称加解密算法。服务方生成一对 RSA 密钥&#xff0c;即公钥 私钥&#xff0c;将公钥提供给调用方&#xff0c;调用方使用公钥对数据进行加密后&#xff0c;服务方根据私钥进行解密。 1、RSA生…...

(Mybatis 学习【1】)整合 Mybatis 开发流程

Mybatis 整合流程 ① 添加MyBatis的依赖 ② 创建数据库表 ③ 编写pojo实体类 ④ 编写映射文件UserMapper.xml ⑤ 编写核心文件mybatis-config.xml ⑥ 编写测试类** 编写 pojo 实体类 (设计相应的数据库&#xff09; Data AllArgsConstructor NoArgsConstructor public class…...

一文搞懂Kerberos

Kerberos一词来源于古希腊神话中的Cerberus——守护地狱之门的三头犬&#xff0c;Kerberos是为TCP/IP 网络设计的可信第三方鉴别协议&#xff0c;最初是在麻省理工学院(MIT)为Athena 项目而开发的。Kerberos服务起着可信仲裁者的作用&#xff0c;可提供安全的网络鉴别&#xff…...

Go爬虫学习笔记(三)

day3 ‍ 04&#xff5c;敏捷之道&#xff1a;大型Go项目的开发流程是怎样的&#xff1f; 瀑布模式 流程&#xff1a; 市场调研需求分析产品设计研发实现集成与测试项目交付与维护 适用场景&#xff1a; 需求在规划和设计阶段就已经确定了&#xff0c;而且在项目开发周期内&…...

CASTEP参数设置(2)

虚拟试验&#xff08;分子模拟&#xff09; 在表征材料以及材料的相关性质时&#xff0c;只要是采用已有的理论加以解释 但是通常来说&#xff0c;需要采用已有的理论来进行设计和探索&#xff0c;伴随着工业软件的发展&#xff0c;应当选用仿真技术来缩小探索范围 传统试验V…...

浅谈对Promise的理解以及在工作中的应用

浅谈对Promise的理解以及在工作中的应用Promise的概念背景知识JavaScript的同步和异步JavaScript事件循环回调函数进行异步操作解决方案&#xff1a;PromisePromise 在工作中的运用创建PromisePromise封装AJAXPromise链式操作Promise.all()Promise.race()async和await总结Promi…...

开源|快速入门和理解并模拟实现GPS户外机器人的定位与导航

户外机器人的定位导航相对于需要建图的场景来说&#xff0c;是比较简单容易实现的&#xff0c;因为可以借助第三方地图完成定位&#xff0c;并在第三方地图中完成路径规划和下发航点等操作&#xff0c;实现的难题在于如何控制机器人完成步行和转弯。 这些在不引进RTK高精度定位…...