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
importpourDialogFragmentetFragmentManager?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