[/b], der 4 Karten enthält, die zu anderen Fragmenten navigieren (FavouritesFragment, LatestPlayedFragment, MostPlayedFragment, LatestAddedFragment). Wenn ich zu einem dieser Fragmente navigiere und die Zurück-Taste drücke, erscheint das PlaylistsFragment als leerer/leerer Bildschirm. Wenn ich jedoch zu einer anderen Registerkarte wechsle und zurückkomme, wird das Fragment korrekt angezeigt
private fun navigateToFragment(fragment: Fragment) {
val fragmentManager = requireActivity().supportFragmentManager
fragmentManager.fragments.forEach { existingFragment ->
if (existingFragment != this &&
existingFragment !is PlaylistsFragment &&
existingFragment.isAdded) {
fragmentManager.beginTransaction()
.remove(existingFragment)
.commitNow()
}
}
fragmentManager.beginTransaction().apply {
setReorderingAllowed(true)
hide(this@PlaylistsFragment)
add(R.id.main, fragment)
addToBackStack(null)
commit()
}
mMainActivityUiController?.hideTabLayout()
}
Verwendung von bringToFront() in onResume und onHiddenChanged: Die Ansicht scheint in der Hierarchie vorhanden zu sein, aber auf dem Bildschirm nicht sichtbar
Was ist also der richtige Ansatz, um sicherzustellen, dass das Fragment beim Zurücknavigieren vom Backstack sichtbar ist, ohne dass es beim Navigieren zu ihnen zu Überschneidungen mit dem Inhalt der untergeordneten Navigation kommt?
Ich habe eine Audio-Player-App, sie enthält ein [b][code]PlaylistsFragment[/code][/b], der 4 Karten enthält, die zu anderen Fragmenten navigieren (FavouritesFragment, LatestPlayedFragment, MostPlayedFragment, LatestAddedFragment). Wenn ich zu einem dieser Fragmente navigiere und die Zurück-Taste drücke, erscheint das PlaylistsFragment als leerer/leerer Bildschirm. Wenn ich jedoch zu einer anderen Registerkarte wechsle und zurückkomme, wird das Fragment korrekt angezeigt [img]https://i.sstatic.net/AbbuNe8J.png[/img]
[img]https://i.sstatic.net/8QM7PbTK.png[/img]
[img]https://i.sstatic.net/8M13idhT.png[/img]
Das ist meine aktuelle Implementierung: [code]@AndroidEntryPoint class PlaylistsFragment : Fragment(R.layout.fragment_playlists), MenuProvider, PlaylistsAdapter.PlaylistAdapterListener {
companion object { private const val TAG = "PlaylistsFragment" const val NEW_PLAYLIST_ID_MARKER = -100L }
private var _binding: FragmentPlaylistsBinding? = null private val binding get() = _binding!!
private val playlistsViewModel by viewModels () private lateinit var playlistsAdapter: PlaylistsAdapter
private val selectedPositions: MutableSet = mutableSetOf() private var actionMode: ActionMode? = null
private var originalPlaylists = arrayListOf() private var mMainActivityUiController: MainActivityUiController? = null private var menu: Menu? = null private var sortType: PlaylistSortType = PlaylistSortType.NAME_ASC private lateinit var requestPermissionLauncher: ActivityResultLauncher private var storagePermissionGranted = false private var menuHost: MenuHost? = null
private val recentlyPlayedViewModel by viewModels() private val mostPlayedViewModel by viewModels()
override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) setupPermissionLauncher() }
Log.d( TAG, "Playlist name entered: $playlistName. Navigating to AddClipsToPlaylistFragment for new playlist." ) val fragment = AddClipsToPlaylistFragment.newInstance(NEW_PLAYLIST_ID_MARKER, playlistName) parentFragmentManager.beginTransaction() .replace(R.id.main, fragment) .addToBackStack(null) .commit() } }
binding.cardRecentlyPlayed.setOnClickListener {
val recentlyPlayedFragment = RecentlyPlayedFragment()
val fragmentManager = requireActivity().supportFragmentManager val transaction = fragmentManager.beginTransaction()
val favouritesClipsFragment = FavouritesClipsFragment() val fragmentManager = requireActivity().supportFragmentManager val transaction = fragmentManager.beginTransaction()
private fun setupMainActivityUiController() { if (activity is MainActivityUiController) { mMainActivityUiController = activity as MainActivityUiController } }
private fun observePlaylistList() { viewLifecycleOwner.lifecycleScope.launch { repeatOnLifecycle(Lifecycle.State.STARTED) { Log.d(TAG, "Observer: STARTED collecting playlistList StateFlow.") playlistsViewModel.playlists.collect { resource -> if (!isAdded || _binding == null) { Log.w(TAG, "Observer: Fragment view null or not added. Skipping UI update.") return@collect } Log.d( TAG, "Observer: Collected playlistList resource: ${resource::class.java.simpleName}" )
binding.progressBar.visibility = if (resource is Resource.Loading) View.VISIBLE else GONE val showList = resource is Resource.Success && resource.data.isNotEmpty() val showEmpty = (resource is Resource.Success && resource.data.isEmpty()) || resource is Resource.Empty binding.recyclerPlaylists.visibility = if (showList) View.VISIBLE else View.INVISIBLE binding.emptyView.visibility = if (showEmpty) View.VISIBLE else GONE
when (resource) { is Resource.Success -> { val playlists = resource.data originalPlaylists.clear() originalPlaylists.addAll(playlists) playlistsAdapter.submitList(ArrayList(playlists)) { val itemCount = playlistsAdapter.itemCount binding.recyclerPlaylists.visibility = if (itemCount > 0) View.VISIBLE else View.INVISIBLE binding.emptyView.visibility = if (itemCount == 0) View.VISIBLE else GONE binding.emptyView.text = getString(R.string.no_playlists_found) } Log.d( TAG, "Successfully submitted ${playlists.size} playlists to adapter." ) }
val editTextPlaylistName = dialog.findViewById(R.id.editTextPlaylistName) val btnCreatePlaylist = dialog.findViewById(R.id.btnCreatePlaylist) val btnCancel = dialog.findViewById(R.id.btnCancel)
// Set focus and show keyboard editTextPlaylistName.requestFocus() val imm = context.getSystemService(Context.INPUT_METHOD_SERVICE) as InputMethodManager imm.toggleSoftInput(InputMethodManager.SHOW_FORCED, 0)
btnCreatePlaylist.setOnClickListener { val playlistName = editTextPlaylistName.text.toString().trim() if (playlistName.isNotEmpty()) { onPlaylistCreated(playlistName) dialog.dismiss() } else { editTextPlaylistName.error = "يرجى إدخال اسم قائمة التشغيل" } }
dialog.show() } } } } [/code] Was ich bisher versucht habe: [list] [*][b]Verwenden von replace() anstelle von hide()/add()[/b]: Dadurch überlappten sich Fragmente und zeigten Inhalte aus mehreren Fragmenten gleichzeitig an
[*][b]Hinzufügen eines Rückrufs von onHiddenChanged()[/b]:
[/list] [code]override fun onHiddenChanged(hidden: Boolean) { super.onHiddenChanged(hidden) if (!hidden) { _binding?.let { it.playlistsFragment.visibility = View.VISIBLE it.root.bringToFront() } (activity as? MainActivity)?.getToolbar()?.visibility = View.VISIBLE mMainActivityUiController?.showTabLayout() } } [/code] [list] [*][b]Alte Fragmente vor der Navigation manuell entfernen[/b]: [/list] [code]private fun navigateToFragment(fragment: Fragment) { val fragmentManager = requireActivity().supportFragmentManager
fragmentManager.fragments.forEach { existingFragment -> if (existingFragment != this && existingFragment !is PlaylistsFragment && existingFragment.isAdded) { fragmentManager.beginTransaction() .remove(existingFragment) .commitNow() } }
mMainActivityUiController?.hideTabLayout() } [/code] [list] [*][b]Verwendung von bringToFront() in onResume und onHiddenChanged: Die Ansicht scheint in der Hierarchie vorhanden zu sein, aber auf dem Bildschirm nicht sichtbar[/b] [/list] [b]Das Layout des Playlist-Fragments[/b] [code]
[/code] Was ist also der richtige Ansatz, um sicherzustellen, dass das Fragment beim Zurücknavigieren vom Backstack sichtbar ist, ohne dass es beim Navigieren zu ihnen zu Überschneidungen mit dem Inhalt der untergeordneten Navigation kommt?
Ich habe eine Audio-Player-App, sie enthält ein PlaylistsFragment , der 4 Karten enthält, die zu anderen Fragmenten navigieren (FavouritesFragment, LatestPlayedFragment, MostPlayedFragment,...
Ich habe eine Audio-Player-App, sie enthält ein PlaylistsFragment , der 4 Karten enthält, die zu anderen Fragmenten navigieren (FavouritesFragment, LatestPlayedFragment, MostPlayedFragment,...
Ich arbeite an einer multimodalen Chat-Anwendung, in der Benutzer Textanfragen senden, und der Chatbot antwortet mit Text, Bildern und Miniaturansichten. Eine der Anforderungen besteht darin,...