這里有我的活動和片段的代碼:
活動:
class Activity0: AppCompatActivity() {
private lateinit var binding: Activity0Binding
override fun onCreate(servedInstanceState: Bundle? ){
super.onCreate(s savedInstanceState)
binding = Activity0Binding.inflate(layoutInflater)
setContentView(binding.root)
binding.popUpButton.setOnClickListener {
supportFragmentManager.commit {
replace(R.id.quiz_fragment_container, Activity0FragmentNull() )
}
binding.popUpButton.isEnabled = false
}
}
}
片段:
class Activity0FragmentNull : Fragment( ) {
...
override fun onCreateView(
膨脹器。LayoutInflater, container: ViewGroup?
savedInstanceState。Bundle?
)。視圖? {
Activity0().popUpButton.isEnabled = true: View?
return inflater.inflate(R.layout.activity0_null, container, false)
}
...
}
在這里,我試圖改變我的按鈕的狀態,使其在片段啟動時被啟用。然而,每當我的片段被運行時,應用程式就會崩潰并回傳到主活動(應用程式的開始)。為什么從我的片段中試圖到達我的活動中的一個按鈕會導致應用程式崩潰。謝謝你的時間和任何幫助,謝謝。
uj5u.com熱心網友回復:
你永遠不要創建Activity物件,那是作業系統的責任。所以永遠不要做Activity0()。在一個片段中,你可以通過使用activity屬性來訪問相關活動。
就你的問題而言,可以這樣解決
。
定義一個介面
interface ButtonStateManager{
fun setEnabled(enabled: Boolean)
讓你的Activity實作這個介面
class Activity0: AppCompatActivity(), ButtonStateManager {
...
override fun setEnabled( enabled: Boolean) {
binding.popUpButton.isEnabled = enabled
}
}
現在你可以從Fragment中啟用/禁用該按鈕,如
。
override fun onViewCreated(view。View, savedInstanceState: Bundle?) {
super.onViewCreated(view, savedInstanceState)
/*將活動轉為ButtonStateManager,然后呼叫函式*/。
(activity as? ButtonStateManager)?.setEnabled(true)
}
uj5u.com熱心網友回復:
我認為mightyWoz的方法足以滿足你的目的。
但是根據我的經驗,這種事情經常發生,有一種方法可以即時處理它們。
我通常的作業流程是這樣的:讓諸如警報器或片段之類的子活動訪問其父活動。
- 在子活動中,宣告一個回呼,然后在你知道會運行的地方呼叫它。它看起來像這樣:
- 在子活動中宣告一個回呼,然后在你知道會運行的地方呼叫它。
在子程式中
class Activity0FragmentNull : Fragment() {
var controllParentCallback:(()->Unit)?=null。
...
override fun onCreateView(
膨脹器。LayoutInflater, container: ViewGroup?
savedInstanceState。Bundle?
)。視圖? {
controllParentCallback?.invoke()
return inflater.inflate(R.layout.activity0_null, container, false)
}
...
現在在父活動中,給子活動一個名字,然后給其回呼值。它看起來像這樣:
class Activity0: AppCompatActivity() {
private lateinit var binding: Activity0Binding
override fun onCreate(servedInstanceState: Bundle? ){
super.onCreate(s savedInstanceState)
binding = Activity0Binding.inflate(layoutInflater)
setContentView(binding.root)
val childFragment=Activity0FragmentNull()
childFragment.controllParentCallback={
binding.popUpButton.isEnabled=true
}
binding.popUpButton.setOnClickListener {
supportFragmentManager.commit {
replace(R.id.quiz_fragment_container, Activity0FragmentNull() )
}
binding.popUpButton.isEnabled = false
}
}
}
因此,盡管創建一個界面是非常好的,也是非常Kotlinic的,像這樣的一個小回呼,在你創建子代而不知道以后需要訪問父代的情況下,真的會加快開發時間。
轉載請註明出處,本文鏈接:https://www.uj5u.com/net/318386.html
標籤:
