J'essaie d'appeler mon dialogfragment dans mon loginfragment et d'afficher une boîte de dialogue d'alerte, la méthode show dit que:
Aucune des fonctions suivantes ne peut être appelée avec les arguments fourni. show (FragmentManager !, String!) défini dans org.greenstand.android.TreeTracker.fragments.CustomDialogFragment show (FragmentTransaction !, String!) défini dans org.greenstand.android.TreeTracker.fragments.CustomDialogFragment
import android.app.Activity import android.content.Intent import android.content.pm.PackageManager import android.os.Bundle import android.view.LayoutInflater import android.view.View import android.view.ViewGroup import android.widget.Toast import androidx.fragment.app.Fragment import androidx.lifecycle.Observer import kotlinx.android.synthetic.main.activity_main.* import kotlinx.android.synthetic.main.fragment_login.* import kotlinx.coroutines.Dispatchers import kotlinx.coroutines.GlobalScope import kotlinx.coroutines.launch import kotlinx.coroutines.withContext import org.greenstand.android.TreeTracker.R import org.greenstand.android.TreeTracker.application.Permissions import org.greenstand.android.TreeTracker.utilities.* import org.greenstand.android.TreeTracker.viewmodels.LoginViewModel import org.koin.android.viewmodel.ext.android.viewModel import timber.log.Timber class CustomDialogFragment : DialogFragment() { private var content: String? = null override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) content = arguments!!.getString("content") val style = DialogFragment.STYLE_NO_FRAME val theme = R.style.DialogTheme setStyle(style, theme) } override fun onAttach(context: Context) { super.onAttach(context) } override fun onCreateView(inflater: LayoutInflater, container: ViewGroup, savedInstanceState: Bundle): View { val view = inflater!!.inflate(R.layout.layout_dialog, container, false) val btnAccept = view.findViewById<View>(R.id.buttonAccept) as Button val textViewContent = view.findViewById<View>(R.id.textViewContent) as TextView textViewContent.text = content; btnAccept.setOnClickListener{ dismiss(); } return view; } companion object { fun newInstance(content: String) : CustomDialogFragment { val f = CustomDialogFragment() val args = Bundle() args.putString("content", content) f.arguments = args return f } } }
Voici mon code CustomDialogFragment:
val newFragment = CustomDialogFragment.newInstance("pass content here") val fm = fragmentManager newFragment.show(fm, "look")
Quelqu'un peut-il indiquer exactement ce dont j'ai besoin pour passer dans la méthode show? Toute aide est appréciée, merci :)
3 Réponses :
Assurez-vous que votre activité est un enfant de https: // developer.android.com/reference/androidx/fragment/app/FragmentActivity.html , par exemple, vous pouvez utiliser https://developer.android.com/reference/androidx/appcompat/app/AppCompatActivity en tant qu'activité parent.
Ensuite, pour obtenir le fragmentManager, utilisez la méthode getSupportFragment ()
, ou simplement val fm = supportFragmentManager
mon activité étend déjà AppCompatActivity, mais appeler supportFragmentManager dans la méthode show donne la même erreur
Je ne vois aucune importation DialogFragment
dans votre classe customDialog ()
. En fait, il y a une importation de Fragment sur la ligne no: 9
. êtes-vous sûr de vous étendre à partir du bon DialogFragment
?
classe CustomDialogFragment: DialogFragment ()
?
@cutiko Je suppose qu'il devrait y avoir une importation androidx.fragment.app.DialogFragment
dans sa section importations. généralement, ce type d'erreur est dû au mélange d'importations.
Non, l'erreur vient du fait que la méthode show nécessite la transaction de fragment, pas le gestionnaire de fragments.
Je vois cela mais en général, cela ne devrait pas être le cas avec DialogFragment
il y a 2 méthodes d'exposition l'une qui accepte un gestionnaire de fragments
et l'autre qui accepte un fragment transaction
. s'il est bien fait, il devrait pouvoir utiliser les deux.
Vous êtes rigth! J'ai dû vérifier la documentation developer.android.com/reference/android/support / v4 / app /… Alors le problème est que l'autre FragmentManager!
remarque le symbole kotlin non nul
[MISE À JOUR]
Le problème est que la méthode peut recevoir un FragmentManager
mais il ne doit pas être nul, regardez l'erreur et le symbole Kotlin non nullable
FragmentManager !!
Donc vous pouvez faire
val transaction = supportFragmentManager.beginTransaction() val previous = supportFragmentManager.findFragmentByTag(ExampleDialogFragment.TAG) if (previous != null) { transaction.remove(previous) } transaction.addToBackStack(null) val dialogFragment = ExampleDialogFragment.newInstance("parameter") dialogFragment.show(transaction, ExampleDialogFragment.TAG)
Veuillez voir les commentaires dans la réponse de Noushad Hasan
Vous passez le FragmentManager à la méthode, il a besoin de la
FragmentTransaction
et d'une String
comme balise:
companion object { const val TAG = "TAG" }
Quelques suggestions:
Vous pouvez vous rendre DialogFragment
plus kotliny en utilisant les fonctions standard de Kotlin
companion object { private const val KEY = "param1" @JvmStatic fun newInstance(param1: String) = ExampleDialogFragment().apply { arguments = bundleOf(KEY to param1) } }
Vous pouvez obtenir un bon exemple en créant un Fragment
à l'aide de l'assistant Android Studio et en vérifiant l'option de méthode d'usine.
De plus, puisque la balise sera pour votre DialogFragment
vous pouvez en faire une constante publique:
val transaction = supportFragmentManager.beginTransaction() newFragment.show(transaction, "SOME_TAG")
Et peut-être voulez-vous vérifier si le fragment de dialogue est déjà présent et le supprimer, pour fonctionner réellement comme un dia frais journal
fm?.let {newFragment.show(fm, "your tag")} //fm here can also be it
Veuillez publier le journal des messages d'erreur. À première vue, votre code semble correct.
eh bien, la seule erreur que j'obtiens vient de la méthode de show elle-même
je modifierai mon message
Quelles sont vos instructions
import
pourDialogFragment
etFragmentManager
?Vous mélangez probablement des fragments de support et de framework. Utilisez uniquement des fragments et des fragments de boîte de dialogue de la bibliothèque de support, et non du framework.
Je suis très nouveau sur kotlin, donc je publierai mes importations
Je ne vois pas où vous importez
DialogFragment
.Eh bien, je n'appelle pas dialogfragment parce que j'ai ma propre implémentation DialogFragment dans ma classe séparée
J'ai modifié ma réponse s'il vous plaît jeter un oeil