Android Hide Navigation Bar

根據 Android官方文件可在程式中隱藏Navigation Bar

MainActivity.kt
1
2
3
4
window.decorView.apply {
systemUiVisibility = View.SYSTEM_UI_FLAG_HIDE_NAVIGATION or View.SYSTEM_UI_FLAG_FULLSCREEN
}

但使用滑鼠點擊後,會顯示Navigation Bar,必須再呼叫此函式再將Navigation Bar隱藏起來即可。

何時觸發便是本篇所要談論的重點

我們先將之前Hide Navigation Bar的程式碼寫成函式:hideNavigationBar()。

MainActivity.kt
1
2
3
4
5
6
private fun hideNavigationBar() {
window.decorView.apply {
systemUiVisibility = View.SYSTEM_UI_FLAG_HIDE_NAVIGATION or View.SYSTEM_UI_FLAG_FULLSCREEN
}
}

利用偵測螢幕大小的變化,當作觸發的時機。

MainActivity.kt
1
2
3
4
5
6
7
8
9
10
11
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_main)
var relativeLayout = findViewById<RelativeLayout>(R.id.main_view)
relativeLayout.addOnLayoutChangeListener(
View.OnLayoutChangeListener { v, left, top, right, bottom,
oldLeft, oldTop, oldRight, oldBottom ->

})
}

但由於OnLayoutChangeListener為Callback函式,處理UI變化時,不可在函式中處理。

所以我們必須創建一個Handler來呼叫hideNavigationBar函式

Source Code

MainActivity.kt
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
 class MainActivity : AppCompatActivity() {
private var mUiHandler : UiHandler? = null
private val HANDLER_HIDE_NAVIGATION_BAR = 1

override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_main)
mUiHandler = UiHandler(this)

var relativeLayout = findViewById<RelativeLayout>(R.id.main_view)
relativeLayout.addOnLayoutChangeListener(
View.OnLayoutChangeListener { v, left, top, right, bottom,
oldLeft, oldTop, oldRight, oldBottom ->
if (bottom < oldBottom){
mUiHandler!!.sendEmptyMessageDelayed(
HANDLER_HIDE_NAVIGATION_BAR, 3000)
}
})
hideNavigationBar()
}

private fun hideNavigationBar() {
window.decorView.apply {
systemUiVisibility = View.SYSTEM_UI_FLAG_HIDE_NAVIGATION or View.SYSTEM_UI_FLAG_FULLSCREEN
}
}

private inner class UiHandler(obj: MainActivity) : Handler() {
private val mObj: WeakReference<MainActivity> = WeakReference(obj)
override fun handleMessage(msg: Message) {
super.handleMessage(msg)
when(msg.what) {
HANDLER_HIDE_NAVIGATION_BAR -> {
hideNavigationBar()
}
}
}
}
}

activity_main.xml
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:id="@+id/main_view"
tools:context=".MainActivity">

<TextView
android:id="@+id/test"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_centerInParent="true"
android:text="Hello World!"
/>
</RelativeLayout>

作者

Nick Lin

發表於

2020-03-02

更新於

2023-01-18

許可協議


評論