Kotlin View Binding wird außerhalb von Lifecycle-Methoden zu Null, wenn von einem Fragment zurückgegeben wirdAndroid

Forum für diejenigen, die für Android programmieren
Anonymous
 Kotlin View Binding wird außerhalb von Lifecycle-Methoden zu Null, wenn von einem Fragment zurückgegeben wird

Post by Anonymous »

Ich habe eine App, die mit einer MainActivity und mehreren Fragmenten strukturiert ist, mit denen über einige ImageButtons in dieser Aktivität kommuniziert wird. In einem Fragment (

Code: Select all

UnreviewedFragment
), ich habe eine RecyclerView, deren Adapter geändert werden kann, um andere Informationen anzuzeigen. Dies funktioniert perfekt, wenn ich dieses Fragment zum ersten Mal starte.
Wenn ich jedoch das EditFragment mit dem folgenden Code in MainActivity.kt eingebe:

Code: Select all

addButton.setOnClickListener {
supportFragmentManager.commit {
replace(R.id.fragmentContainerView, "edit")
}
reviewedButton.isEnabled = true
unreviewedButton.isEnabled = true
}
Und kehren Sie dann mit dem folgenden Code zu einer der beiden Ansichten zurück:

Code: Select all

unreviewedButton.setOnClickListener {
Log.d("MainActivity", "Unreviewed Button pressed! Is it enabled: ${unreviewedButton.isEnabled}")
if (supportFragmentManager.findFragmentByTag("edit") != null) {
supportFragmentManager.commit {
replace(R.id.fragmentContainerView, "restaurants")
}
}
supportFragmentManager.executePendingTransactions()

restaurantsFragment.setModeUnreviewed()
unreviewedButton.isEnabled = false
reviewedButton.isEnabled = true
}

reviewedButton.setOnClickListener {
Log.d("MainActivity", "Reviewed Button pressed! Is it enabled: ${reviewedButton.isEnabled}")
if (supportFragmentManager.findFragmentByTag("edit") != null) {
supportFragmentManager.commit {
replace(R.id.fragmentContainerView, "restaurants")
}
}
supportFragmentManager.executePendingTransactions()
restaurantsFragment.setModeReviewed()
unreviewedButton.isEnabled = true
reviewedButton.isEnabled = false
}
Die in den Methoden setModeReviewed und setModeUnreviewed im UnreviewedFragment verwendeten Bindungen werden plötzlich null.
Meine Protokollierungsanweisungen und einige Debugging-Anweisungen deuten darauf hin, dass die Bindungen nach dem Aufruf von replace immer noch Werte in onViewCreated haben, diese Werte jedoch zu verlieren scheinen und bei der Transaktion zu Nullen werden ist fertig und restaurantsFragment.setModeReviewed() wird im onClickListener der Schaltfläche aufgerufen.
Die onCreateView-Funktion meines Fragments sieht folgendermaßen aus:

Code: Select all

override fun onCreateView(
inflater: LayoutInflater, container: ViewGroup?,
savedInstanceState: Bundle?
): View? {
Log.d("UnreviewedFragment", "onCreateView")
// set view bindings
// TODO try resetting with simple findviewbyid to see if binding null exception leaves
_binding = FragmentUnreviewedBinding.inflate(layoutInflater)

Log.d("UnreviewedFragment", "binding is: $_binding")
Log.d("UnreviewedFragment", "Inflated! Viewmodel: $viewModel")

reviewedAdapter = ReviewedItemAdapter()
unReviewedAdapter = UnreviewedItemAdapter()
binding.unreviewedRecyclerView.adapter = unReviewedAdapter
binding.unreviewedRecyclerView.layoutManager = LinearLayoutManager(activity?.applicationContext!!)

viewModel.restaurantList.observe(viewLifecycleOwner, Observer { restaurants ->
restaurants?.let { unReviewedAdapter.setRestaurants(it) }
restaurants?.let { reviewedAdapter.setRestaurants(it) }
})
val view = binding.root
return view
}
Und der Code zum Beenden von EditItemFragment sieht so aus:

Code: Select all

override fun onCreateView(
inflater: LayoutInflater, container: ViewGroup?,
savedInstanceState: Bundle?
): View? {
// Inflate the layout for this fragment
_binding = FragmentEditItemBinding.inflate(layoutInflater)

// set up listeners
binding.submitButton.setOnClickListener {
viewModel.insert(Restaurant(
binding.restaurantNameEdit.text.toString(),
binding.restaurantAddressEdit.text.toString(),
binding.restaurantWebsiteEdit.text.toString(),
"dragon_hotpot_outside", // TODO fix this later
binding.priceBar.rating.toInt(),
null,
Date(),
null
))
}
val view: View = binding.root
return view
}

Quick Reply

Change Text Case: 
   
  • Similar Topics
    Replies
    Views
    Last post