AppCompatActivity 去掉标题栏和EditText弹出软键盘遮住输入框难题

正文

先是,javascript
在浏览器端运行是单线程的,那是由浏览器决定的,那是为着幸免八线程执行不一职务会爆发争论的情形。也就是说我们写的javascript
代码只在一个线程上运行,称之为主线程(HTML5提供了web worker
API可以让浏览器开一个线程运行相比复杂耗时的
javascript义务,不过那么些线程仍受主线程的主宰)。单线程的话,倘若大家做一些“sleep”的操作比如说:

var now = + new Date()
while (+new Date() <= now + 1000){
//这是一个耗时的操所
}

那就是说在那将近一秒内,线程就会被堵塞,不可能继续执行上边的职务。

还有些操作比如说获取远程数据、I/O操作等,他们都很耗时,假设使用一块的办法,那么进度在推行这一个操作时就会因为耗时而等待,就好像上边这样,下边的职务也只能等待,这样功效并不高。

那浏览器是如何做的呢?

俺们找到WHATWG规范对Event
loop
的介绍:

WHATWG Event loop定义

为了协调事件,用户交互,脚本,渲染,网络等,用户代理必须选取事件循环。

事件循环的紧要机制就是任务队列机制:

  • 一个事件循环有一个仍然四个任务队列(task
    queues)。职务队列是task的平稳列表,task是调度伊芙nts,Parsing,Callbacks,Using
    a resource,Reacting to DOM manipulation那几个职务的算法;
  • 种种任务都来自一个一定的任务源(task
    source)(比如鼠标键盘事件)。来自同一个特定职责源且属于特定事件循环的任务必须被投入到同一个义务队列中,来自差异职责源的任务可以放在分裂的义务队列中;
  • 浏览器调用那几个队列中的职责时采纳如此的做法:
    相同队列中的职务根据先进先出的逐条,
    差其余队列根据提前安装的系列优先级来调用.
    例如,用户代理可以有一个用于鼠标和键盘事件的天职队列(用户交互义务源),另一个用以其余职务。然后,用户代理75%几率调用键盘和鼠标事件职务队列,25%调用其余队列,
    那样的话就保险界面响应而且不会饿死其余任务队列.
    但是同样队列中的职责要绳趋尺步先进先出的次第。也就是说单独的天职队列中的职责连续按先进先出的顺序执行,可是不保障四个职责队列中的义务优先级,具体得以落成可能会陆续执行

在调用职分的进度中, 会发生新的义务, 浏览器就会不停实施义务,
由此称为事件循环.

microtask queue 微职责队列

还有一部分特殊任务, 它们不会被放在task queues中,
会放在一个称为microtask(微任务) queue中, 继续看标准:

Each event
loop

has a microtask queue. A microtask is a
task
that is originally to be queued on the microtask
queue

rather than a task
queue
.

任务队列可以有五个, 可是微职分队列唯有一个.

那么怎样职分是置身task queue, 哪些放在microtask queue呢?
平常对浏览器和Node.js来说:

  • macrotask(宏任务): script(全体代码), setTimeout,
    setInterval, setImmediate, I/O, UI rendering等
  • microtask(微任务): process.nextTick,
    Promises(那里指浏览器完毕的原生 Promise), Object.observe,
    MutationObserver

请进一步令人瞩目macrotask中施行总体代码也是一个宏职分

事件循环处理进度

完全来说, 浏览器端事件循环的一个回合(go-around或者叫cycle)就是:

  • 从macrotask队列中(task queue)取一个宏职责执行, 执行完后,
    取出装有的microtask执行.

  • 再度回合

甭管在执行macrotask依旧microtask,
都有可能暴发新的macrotask或者microtask, 就像此持续执行.

用职分队列机制解释异步操作顺序

那边有局部广阔异步操作:

const interval = setInterval(() => {
  console.log('setInterval')
}, 0)

setTimeout(() => {  
  console.log('setTimeout 1')
  Promise.resolve().then(() => {
    console.log('promise 3')
  }).then(() => {
    console.log('promise 4')
  }).then(() => {
    setTimeout(() => {
      console.log('setTimeout 2')
      Promise.resolve().then(() => {
        console.log('promise 5')
      }).then(() => {
        console.log('promise 6')
      }).then(() => {
        clearInterval(interval)
      })
    }, 0)
  })
}, 0)

Promise.resolve().then(() => {
  console.log('promise 1')
}).then(() => {
  console.log('promise 2')
})

结果(Chrome 63.0.3239.84; Mac OS):

promise 1
promise 2
setInterval
setTimeout 1
promise 3
promise 4
setInterval // 大部分情况下2次, 少数情况下一次
setTimeout 2
promise 5
promise 6

本条顺序是怎么着得来的?

俺们先讲promise 4后边只现出两回setInterval的意况,
画个图简单表示一下以此历程:

任务队列机制

注意

本图为了便于把各时间段(Cycle)队列的职务都画在队列中去了,
实际上执行一个task 和 microtask 后就会把那么些职分从相应队列中去除

第一, 主职责就是举行脚本, 也就是推行上述代码, 那也是一个task.
在履行代码进度中, 碰着set提姆eout、setInterval 就会将回调函数添加到task
queue中, 遇到 promise 就会将then回调添加到 microtask 中去.

Task执行完, 接着取所有 microtask 执行, 所有microtask 执行完了, microtask
queue也就空了, 接着再取task执行, 要是microtask queue为空, 没有任务,
则继续取下一个task执行, 就这么循环执行. 图中箭头就意味着执行的顺序.

那就是说为啥promise 4后边半数以上场馆下冒出2次setInterval,
少数动静出现1次啊?

我猜测那是因为setInterval是有最短间隔时间的(chrome下4ms左右),
这些小时不一机子、分化浏览器都有可能不同. 代码中的参数是0,
意味着尽可能短的大运内就会时有暴发一个task加入到 task queue中.
浏览器在实施setInterval后到实施下一个task前,
时间间隔就可能超越那么些最短期, 因而会发出一个setInterval task.

自家是那样论证的:

自我把带有promise5、promise6回调函数的set提姆eout的小运设置大一点,
让它推迟插入task queue中:

...  
setTimeout(() => {
      console.log('setTimeout 2')
      Promise.resolve().then(() => {
        console.log('promise 5')
      }).then(() => {
        console.log('promise 6')
      }).then(() => {
        clearInterval(interval)
      })
}, 10)   //这里加上10ms 
...

结果是promise 4前面的setInterval出现了5次, 由此我觉得promise
4后边一大半动静下冒出2次setInterval、少数动静出现三回的原由就是浏览器在实践setInterval回调函数后、执行set提姆eout回调函数前,
时间间隔半数以上情状超越了那一个最长期.

除此以外, 我试着再相继增加1ms, 直到14ms——也就是充裕4ms时, promise
4后边的setInterval变成了6次,
可以认为setInterval最短间隔时间在Chrome下约为4ms(不考虑机子质量、设置).

Node中的奇怪结果

率先说雅培(Abbott)(Nutrilon)下, 在Node中也呈现了职分队列的机制, 可是那不是Node完成的,
那是V8达成的, 由Node调用了V8职分队列机制的API. 至于为何是V8落成的,
我们翻翻ECMA
262

标准对 Job 和 Job queue 的牵线就足以摸清

唯独令人摸不着头脑的是, 那段代码在node v8.5.0下有时会现出这么的结果:

promise 1
promise 2
setInterval
setTimeout 1
promise 3
promise 4
setInterval
setTimeout 2
setInterval   // 为什么会出现setInterval???
promise 5
promise 6

按说应该是set提姆eout 2 => promise 5 => promise 6,
因为出口set提姆eout 2的回调函数是task, 执行完这几个task后应该调用microtask
输出promise 5 => promise 6啊? 很意外! Node对V8确实有些改动,
不明了是或不是那上头原因…

还请大神解惑!

1. AppCompatActivity去掉标题栏

此处除掉标题栏,须要专注一点,AppCompactActivity是三番四回自Activity。但是,AppCompactActivity据查看网上资料得知,其实它一般没有标题栏,上边显示的标题栏是一个ActionBar控件(PS:即标题栏部分是一个控件,该控件功用还相比强硬),由此AppCompactActivity可以对该控件添加相关再次回到、许多等接近作用按钮,如若不添加那些按钮看起来就好像一个标题栏。

 

因此,在网上广大去安插value文件夹中的style.xml文件或者在AndroidManifest.xml文件修改theme属性值都是不可以有效去掉标题栏的。这几个主意唯有适用所写类继承自Activity的类。

 

那么继续自AppCompactActivity的类,在onCreateView中投入以下第一行代码即可有效隐藏标题栏,参与两行即可兑现占据全屏效率。(PS:经过楼主自己测试普通浏览滑动界面可以隐蔽,可是在某些情状下,比如该界面有一个视频播放效果,点击全屏播放,退出全屏后,标题栏可能又力不从心隐藏。可是貌似景观下,隐藏成效照旧没难点的)

 

getSupportActionBar().hide();   //隐藏标题栏
getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN, WindowManager.LayoutParams.FLAG_FULLSCREEN);   //实现全屏,隐藏手机顶部时间相关信息显示

 

 

参考资料android开发:activity继承AppCompatActivity
去掉标题栏

 

 


原稿地址在我的博客,
转发注明来源

2.EditText弹出软键盘遮住输入框难题

实际表明摘抄自一篇网友博客(PS:方便未来自己查阅,原文链接

在AndroidManifest.xml中对应的Activity配置:android:windowSoftInputMode=”adjustResize”(PS:或者换成”stateVisible|adjustResize”,此时会强制弹出软盘)

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="com.example.helloworld">

    <uses-permission android:name="android.permission.INTERNET" />

    <application
        android:allowBackup="true"
        android:icon="@mipmap/ic_launcher"
        android:label="@string/app_name"
        android:supportsRtl="true"
        android:theme="@style/AppTheme">
        <activity android:name=".Main2Activity"
            android:windowSoftInputMode="adjustResize">
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />

                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
        </activity>
        <activity android:name=".MainActivity"></activity>
    </application>

</manifest>

 

意思:该页面荧屏内容被减去,以腾出软键盘的空间.

分解它们的意义:

  • stateUnspecified:界面没有安装”android:windowSoftInputMode”时的状态.这些情况是弹出有EditText的界面时时不弹出软键盘的,当EditText获取关节的时候弹出软件盘
  • stateUnchanged:状态不转移,意思就是和上一个界面相同,上一个界面弹出软键盘,跳转到那些界面时,软键盘也是弹出状态.
  • stateHidden:隐藏键盘,弹出那些界面的时候,不管上个界面是怎么状态,那一个界面的软键盘都是隐匿的.
  • stateAlwaysHidden:一向隐蔽(跟上面的分别未知,试不出来).
  • 葡京网上娱乐场,stateVisible:强制弹出软键盘.跳转到界面后,没有EditText也弹出键盘.
  • stateAlwaysVisible:一向突显键盘(同上).

 

网上一搜事件循环, 很多稿子标题的前方会拉长 JavaScript,
可是自家以为事件循环机制跟 JavaScript 没什么关联, JavaScript
只是一门解释型语言, 方便开发和理解的, 由V8 JIT将 JavaScript
编译成机器语言来调用底层, 至于浏览器怎么实施 JavaScript 代码, JavaScript
管不着也不关切. 因此, “JavaScript事件循环机制”那种说法是不成立的.
事件循环机制是由运行时环境已毕的, 具体来说有浏览器、Node等.
那篇文章就先来说说浏览器中落成的事件循环机制.

您甚至读到那了

小结一下:

读书技能依然有走后门的, 这就是读标准 😉