1
votes

Appel de DialogFragment dans Fragment Kotlin

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 :)


9 commentaires

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 pour DialogFragment et FragmentManager ?


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


3 Réponses :


1
votes

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


1 commentaires

mon activité étend déjà AppCompatActivity, mais appeler supportFragmentManager dans la méthode show donne la même erreur



0
votes

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 ?


5 commentaires

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



3
votes

[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


0 commentaires