我遇到的問題似乎很奇怪。
話說回來
我有一個帶有 3 個按鈕的底部導航選單的應用程式,每個按鈕有 3 個片段,還有一個 MainActivity。當導航到這些片段中的任何一個時,一切都按預期進行。 當我從這3個片段中的任何一個導航到另一個片段(讓我們稱之為片段4或fr4)時,問題就出現了。 假設我在fr1,我有一個按鈕可以帶我到fr4。當我回到fr1(使用安卓的回傳按鈕或按fr1的底欄按鈕)時,我在主活動或3個片段中的任何一個所做的事情都會重復2次。如果我再去fr4,然后再回到fr1,那么一切都會重復3次,以此類推。在下面的代碼中,fr1是fragment_home,fr4是fragment_profile。
代碼
MainActivity.kt
class MainActivity : AppCompatActivity(){
private lateinit var navView: 底層導航視圖(BottomNavigationView
private lateinit var binding: ActivityMainBinding
private val sharedViewModel: SharedViewModel by viewModels()
override fun onCreate(sedInstanceState: Bundle? ){
super.onCreate(s savedInstanceState)
binding = ActivityMainBinding.inflate(layoutInflater)
setContentView(binding.root)
navView = binding.navView
val navController = findNavController(R.id.nav_host_fragment_activity_main)
navView.setupWithNavController(navController)
}
override fun onStart() {
super.onStart()
Timber.i("onStart main activity")
}
override fun onStop(){
super.onStop()
Timber.i("onStop main activity")
}
}
framgnet1.kt
class HomeFragment : Fragment( ) {
private var _binding: FragmentHomeBinding? = null
private val binding get() = _binding!
private val sharedViewModel: SharedViewModel by activityViewModels()
private val homeViewModel: HomeViewModel by viewModels()
override fun onCreateView( inflater: LayoutInflater, container: ViewGroup? , savedInstanceState: Bundle?)。視圖? {
_binding = FragmentHomeBinding.inflate(inflater, container, false)
val root: View = binding.root
binding.lifecycleOwner = viewLifecycleOwner
binding.sharedViewModel = sharedViewModel
binding.homeViewModel = homeViewModel
binding.historyButton.setOnClickListener{
Timber.i("組態檔按鈕被點擊")
}
binding.profileButton.setOnClickListener { view ->
profileButtonClicked(view)
}
return root
}
fun profileButtonClicked() {
Timber.i("file button clicked")
val action = HomeFragmentDirections.homeToProfileAction()
NavHostFragment.findNavController(this).navigate(action)
}
}
mobile_navigation.xml
。<?xml version="1.0"/span> encoding="utf-8"/span>?
<導航 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"/span>
android:id="@ id/mobile_navigation"/span>
app:startDestination="@ id/navigation_home">
<片段
android:id="@ id/navigation_home"/span>
android:name="com.comp.comp.ui.home.HomeFragment"/span>
android:label="@string/title_home"。
tools:layout="@layout/fragment_home">
<行動
android:id="@ id/home_to_profile_action"/span>
app:destination="@id/fragment_profile"/span>
app:launchSingleTop="true" />
</fragment>
<片段
android:id="@ id/navigation_dashboard"/span>
android:name="com.comp.comp.ui.dashboard.DashboardFragment"。
android:label="@string/title_dashboard"。
tools:layout="@layout/fragment_dashboard" >
</fragment>
<片段
android:id="@ id/navigation_notifications"/span>
android:name="com.comp.comp.ui.notifications.NotificationsFragment"/span>
android:label="@string/title_notifications"。
tools:layout="@layout/fragment_notifications" />
<片段
android:id="@ id/fragment_profile"/span>
android:name="com.comp.comp.fragment_profile"。
android:label="fragment_profile"。
tools:layout="@layout/fragment_profile" />
</navigation>
我試著在導航動作上切換launchSingleTop="true",但沒有效果。
發生的情況是:
- 在主頁片段中,如果我按下歷史按鈕,它就會列印出 "組態檔按鈕被點擊 "一次 。
- 如果我點擊個人資料按鈕,應用程式將導航到個人資料片段 。
- 我使用后退按鈕或按下底欄上的主頁按鈕,回到主頁片段 。
- 如果我現在按下歷史按鈕,"點擊個人資料按鈕 "被列印了兩次。
如果我重復上述步驟,那么下一次我按下歷史按鈕時,它將列印 "點擊了個人資料按鈕 "3次,以此類推。
我還測驗了去另一個活動,如果我之前去過一次個人資料頁面,我的主活動中的onStop()方法也會運行兩次。同樣,當我回到主活動時,onStart()方法也會運行2次。我所做的一切都會運行2次(或更多),這取決于我去了多少次簡介頁。看起來它在我每次訪問個人資料頁面時都創建了一個主活動,而這些活動是同時存在的。有什么想法嗎?
uj5u.com熱心網友回復:
我嘗試了所有的方法,但都沒有效果。然后我意識到,每一次配置的改變都會種下一棵新的Jake Wharton's Timber debug樹,而且有多少樹就會記錄多少東西。 希望這能幫助到別人。我的錯誤在于,木材計劃是在MainActivity的onCreate中,而它應該在Application的OnCreate中。
轉載請註明出處,本文鏈接:https://www.uj5u.com/qianduan/318401.html
標籤:
