Dialog aufrufen

  • Antworten:5
  • Bentwortet
Robbiani Renato
  • Forum-Beiträge: 609

02.08.2021, 18:23:11 via Website

Hallo zusammen

Ich möchte in einem Fragment ein Dialog aufrufen welcher ich in einem DialogFragment erstelle. Beim Aufruf des Dialogs bleibt aber das ganze hängen da er den "supportFragmentManager" nicht kennen will.

frage = DialogFrag()
        frage.show(supportFragmentManager, DialogFrag.TAG)

Was muss ich in meinem Fragment ändern damit der Dialog angezeigt wird?

Fragment:

package ch.robbisoft.klassennotfall

import android.content.DialogInterface
import android.os.Bundle
import android.util.Log
import androidx.fragment.app.Fragment
import android.view.LayoutInflater
import android.view.View
import android.view.ViewGroup
import android.widget.ArrayAdapter
import android.widget.ListView
import android.widget.TextView
import android.widget.Toast

private val TAG = FragKlasseA::class.simpleName

// TODO: Rename parameter arguments, choose names that match
// the fragment initialization parameters, e.g. ARG_ITEM_NUMBER
private const val ARG_PARAM1 = "param1"
private const val ARG_PARAM2 = "param2"

/**
* A simple [Fragment] subclass.
* Use the [FragKlasseA.newInstance] factory method to
* create an instance of this fragment.
*/
class FragKlasseA : Fragment() {
// TODO: Rename and change types of parameters
private var param1: String? = null
private var param2: String? = null

private lateinit var frage : DialogFrag

override fun onCreate(savedInstanceState: Bundle?) {
    super.onCreate(savedInstanceState)
    arguments?.let {
        param1 = it.getString(ARG_PARAM1)
        param2 = it.getString(ARG_PARAM2)
    }
}

override fun onCreateView(inflater: LayoutInflater, container: ViewGroup?,
    savedInstanceState: Bundle?): View? {
    // Inflate the layout for this fragment
    var view = inflater.inflate(R.layout.frag_klasse_a, container, false)

    var arr_name = arrayOf("AName1", "AName2", "AName3", "AName4")
    val adap_name = ArrayAdapter(requireContext(), R.layout.list_item, arr_name)
    val obj_name = view.findViewById<ListView>(R.id.liste_aname)
    obj_name.adapter = adap_name

    var arr_mutter = arrayOf("03197400", "07938883", "03131125", "????????")
    val adap_mutter = ArrayAdapter(requireContext(), R.layout.list_item, arr_mutter)
    val obj_mutter = view.findViewById<ListView>(R.id.liste_amutter)
    obj_mutter.adapter = adap_mutter
    obj_mutter.setOnItemClickListener { parent, view, position, id ->
        val text = obj_mutter.getItemAtPosition(position).toString()
        Toast.makeText(context, text, Toast.LENGTH_LONG).show()
        frage = DialogFrag()
        frage.show(supportFragmentManager, DialogFrag.TAG)//Fehler!!!!
    }

    var arr_vater = arrayOf("07922546", "07933883", "09174369", "??????")
    val adap_vater = ArrayAdapter(requireContext(), R.layout.list_item, arr_vater)
    val obj_vater = view.findViewById<ListView>(R.id.liste_avater)
    obj_vater.adapter = adap_vater
    obj_vater.setOnItemClickListener { parent, view, position, id ->
        val text = obj_vater.getItemAtPosition(position).toString()
        Toast.makeText(context, text, Toast.LENGTH_LONG).show()
    }

    var arr_allg = arrayOf("@@@@@@@@@", "@@@@@@@@@", "@@@@@@@@@", "@@@@@@@@@")
    val adap_allg = ArrayAdapter(requireContext(), R.layout.list_item, arr_allg)
    val obj_allg = view.findViewById<ListView>(R.id.liste_aallg)
    obj_allg.adapter = adap_allg
    obj_allg.setOnItemClickListener { parent, view, position, id ->
        val text = obj_allg.getItemAtPosition(position).toString()
        Toast.makeText(context, text, Toast.LENGTH_LONG).show()
    }

    return view
}

companion object {
    /**
     * Use this factory method to create a new instance of
     * this fragment using the provided parameters.
     *
     * @param param1 Parameter 1.
     * @param param2 Parameter 2.
     * @return A new instance of fragment FragKlasseA.
     */
    // TODO: Rename and change types and number of parameters
    @JvmStatic
    fun newInstance(param1: String, param2: String) =
        FragKlasseA().apply {
            arguments = Bundle().apply {
                putString(ARG_PARAM1, param1)
                putString(ARG_PARAM2, param2)
            }
        }
}

}

Dialog Fragment:

package ch.robbisoft.klassennotfall

import android.app.AlertDialog
import android.app.Dialog
import android.content.Context
import android.content.DialogInterface
import android.os.Bundle
import androidx.fragment.app.DialogFragment

class DialogFrag : DialogFragment() {
private lateinit var horcher :DialogInterface.OnClickListener

override fun onAttach(context: Context) {
    super.onAttach(context)
    if (context is DialogInterface.OnClickListener){
        horcher = context
    }
}

override fun onCreateDialog(savedInstanceState: Bundle?): Dialog {
    return super.onCreateDialog(savedInstanceState)
    val dialog = AlertDialog.Builder(requireContext())
    dialog.setTitle(R.string.dia_titel)
    dialog.setMessage(R.string.dia_meldung)
    dialog.setCancelable(false)
    dialog.setPositiveButton(R.string.dia_ja, horcher)
    dialog.setNegativeButton(R.string.dai_nein, horcher)
    return dialog.create()
}

companion object{
    val TAG = DialogFrag::class.simpleName
}

}

Gruss Renato

Kommentieren
Beste Antwort
Robbiani Renato
  • Forum-Beiträge: 609

04.08.2021, 18:23:03 via Website

Ciao Jokel

Herzlichen Dank für die Antwort.
Nur so für die Dokumentation. Die Methode "getFragmentManager()" ist veraltet. Es geht neu mit "getParentFragmentManager()"

Gruss Renato

Hilfreich?
Jokel
Kommentieren
Pascal P.
  • Admin
  • Forum-Beiträge: 11.286

02.08.2021, 21:35:49 via Website

Wenn du keinen Fragment Manager initialisiert hast, dann geht das auch nicht.
Du musst schon schauen wo du den her bekommst.

Dafür einfach in der Doku nachlesen:
https://developer.android.com/reference/androidx/fragment/app/Fragment.html,

The main differences when using this support version instead of the framework version are:

    Your activity must extend FragmentActivity
    You must call FragmentActivity.getSupportFragmentManager() to get the FragmentManager 

Also aus der Activity den FragmentManager holen. Somit Referenz zu Activity herstellen und gut ist.
Vlt geht das auch schon mit Kontext.
Inzwischen hast du doch schon genug mit Android gemacht, dass dir sowas einfallen könnte ;)

LG Pascal //It's not a bug, it's a feature. :) ;)

Hilfreich?
Kommentieren
Robbiani Renato
  • Forum-Beiträge: 609

02.08.2021, 22:10:49 via Website

Ciao Pascal

Danke für die Hilfe.
Ich habe mir alles genau angeschaut. Aber ich komme trotzdem nicht weiter. Hast du mir ein Beispiel wie ich das "FragmentActivity.getSupportFragmentManager()" in mein Fragment einbinden muss.

Das "FragmentActivity" wird noch gefunden. Aber beim "getSupportFragmentManager()" geht dann nichts mehr.

Für ein Beispiel oder ein Tipp bin ich dir dankbar.

Gruss Renato

Hilfreich?
Kommentieren
Jokel
  • Forum-Beiträge: 1.530

03.08.2021, 05:26:20 via Website

Du arbeitest mit AndroidX nicht mit den Support libs also ohne das Support beim Fragment Manager.

getFragmentManager()

— geändert am 03.08.2021, 06:25:03

Hilfreich?
Kommentieren
Beste Antwort
Robbiani Renato
  • Forum-Beiträge: 609

04.08.2021, 18:23:03 via Website

Ciao Jokel

Herzlichen Dank für die Antwort.
Nur so für die Dokumentation. Die Methode "getFragmentManager()" ist veraltet. Es geht neu mit "getParentFragmentManager()"

Gruss Renato

Hilfreich?
Jokel
Kommentieren
Jokel
  • Forum-Beiträge: 1.530

05.08.2021, 06:48:30 via Website

Falscher Thread

— geändert am 05.08.2021, 06:55:46

Hilfreich?
Kommentieren