[英]How to hide action bar properly?
我有一個活動和一些片段,並且我有一個操作欄,除了我打開MyTestFragment
的情況外,我需要一直可見,所以當我打開這個片段時,我需要隱藏我的操作欄。
由於我的 Activity 是AppCompatActivity
,我嘗試調用此方法(來自 Activity)以隱藏 actionBar
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.main_activity)
supportActionBar?.hide()
...
它有效,但是,我需要從片段進行此調用,所以我這樣做
override fun onActivityCreated(savedInstanceState: Bundle?) {
super.onActivityCreated(savedInstanceState)
(activity as AppCompatActivity).supportActionBar!!.hide()
}
結果是
操作欄變得有點不可見而不是消失了(你會在時鍾下方看到這個灰色通道)
我在這里想念什么?
UPD
我想對問題進行解釋,為了說明這一點,我做了這樣的代碼:
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.main_activity)
Thread {
Thread.sleep(8000)
mainExecutor.execute {
supportActionBar?.show() <---- 2
}
}.start()
Thread {
Thread.sleep(12000)
mainExecutor.execute {
supportActionBar?.hide() <---- 3
}
}.start()
supportActionBar?.hide() <---- 1
...
這里發生的是 - 標記為1
的方法首先調用,並且操作欄按預期隱藏。 下一個方法 #2 為操作欄調用show()
並且操作欄按預期顯示,但是,當涉及方法 #3 並嘗試再次隱藏操作欄時,錯誤就在這里。 與其隱藏操作欄,不如讓它不可見,您可以看到一條灰線(如屏幕截圖所示)。
因此,如果您在看到一條灰線而不是操作欄之后嘗試執行此操作,則似乎只能在OnCreate()
方法中立即隱藏操作欄。
UPD
我的MainActivity.xml
<?xml version="1.0" encoding="utf-8"?>
<androidx.drawerlayout.widget.DrawerLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:id="@+id/awl_application_drawerLayout"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:background="@color/main_activity_layout_bg_color"
tools:openDrawer="end">
<androidx.coordinatorlayout.widget.CoordinatorLayout
android:layout_width="match_parent"
android:layout_height="match_parent">
<application.widget.toolbar.BondToolbarLayout
android:id="@+id/toolbar_layout"
android:layout_width="match_parent"
android:layout_height="wrap_content"/>
<FrameLayout
android:id="@+id/errorViewContainer"
android:layout_below="@id/toolbar_layout"
android:layout_width="match_parent"
android:layout_height="match_parent"
app:layout_behavior="@string/appbar_scrolling_view_behavior"/>
<FrameLayout
android:id="@+id/fragment_content"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:layout_below="@id/toolbar_layout"
app:layout_behavior="@string/appbar_scrolling_view_behavior"/>
</androidx.coordinatorlayout.widget.CoordinatorLayout>
<androidx.constraintlayout.widget.ConstraintLayout
android:layout_width="match_parent"
android:layout_height="match_parent">
<com.google.android.material.tabs.TabLayout
android:id="@+id/tab_layout"
style="@style/AppTabLayout"
android:layout_width="match_parent"
android:layout_height="@dimen/bottom_nav_tab_height"
android:background="@color/deprecated_palette_FF000000"
android:elevation="6dp"
android:fillViewport="true"
android:padding="0dp"
app:tabPaddingBottom="0dp"
app:tabPaddingEnd="0dp"
app:tabPaddingStart="0dp"
app:tabPaddingTop="0dp"
app:layout_constraintBottom_toBottomOf="parent"
app:tabMinWidth="@dimen/bottom_nav_tab_min_width" />
<CustomView
android:layout_width="match_parent"
android:layout_height="0dp"
android:visibility="invisible"
app:layout_constraintBottom_toTopOf="@id/tab_layout"
app:layout_constraintTop_toTopOf="parent"
app:theme="@style/ThemeOverlay.AppCompat.Light" />
</androidx.constraintlayout.widget.ConstraintLayout>
<FrameLayout
android:id="@+id/navigation_view_container"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:layout_gravity="end"
android:layout_marginTop="?android:attr/actionBarSize" />
</androidx.drawerlayout.widget.DrawerLayout>
我在一個項目中做過類似的事情,但是在一個活動上,但你也可以在 Fragments 上做類似的事情
在這里,我創建了一個名為“setupToolbar”的方法,我在 setContentView(R.layout.___) 之后立即從 onCreate 調用該方法
private fun setupToolbar() {
toolbar.title = ""
setSupportActionBar(toolbar)
toolbar.navigationIcon = ContextCompat.getDrawable(this, R.drawable.arrow_back_white_24)
toolbar.setNavigationOnClickListener {
finish()
}
supportActionBar?.hide()
}
然后我添加了一個手勢監聽器並觀察 SingleTap
private var gestureListener: GestureDetector.SimpleOnGestureListener =
object : GestureDetector.SimpleOnGestureListener() {
override fun onSingleTapUp(e: MotionEvent?): Boolean {
if (toolbar.visibility == View.VISIBLE) {
supportActionBar?.hide()
return true
} else {
supportActionBar?.show()
}
return false
}
}
導航到 TestFragment 時,從 Activity 執行 supportActionBar supportActionBar?.hide()
。 當導航到 ActionBar 應該可見的 Fragment 時,從 Activity 執行supportActionBar?.show()
。
這里可能有兩種選擇。
或者
在 styles.xml 中:
<style name="AppTheme.NoActionBar">
<item name="windowActionBar">false</item>
<item name="windowNoTitle">true</item>
</style>
在來自活動的 kotlin/java 代碼中:
使用上述定義的樣式調用 setTheme 方法,然后調用 recreate()
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.