Как я могу вызвать FragmentManager из фрагмента? Kotlin

#android #kotlin

#Android #kotlin

Вопрос:

Я создаю приложение для сигнализации и пытаюсь открыть диалоговое окно выбора времени. Мне нужно получить данные о времени после его закрытия. Проблема в .show() функции. Это не работает во фрагменте. В нем говорится None of the following functions can be called with the arguments supplied.

Мой класс

 class AlarmPickerDialog : DialogFragment() {
    override fun onCreateView(inflater: LayoutInflater?, container:
    ViewGroup?, savedInstanceState: Bundle?): View {

        var myView = inflater!!.inflate(R.layout.alarm_time_picker, container, false)

        return myView
    }
}
  

И мой вызывающий метод

 val alarmDialog = AlarmPickerDialog()
val fm = getActivity()!!.getSupportFragmentManager()
alarmDialog.show(fm, "MyDialog")
  

Может быть, есть лучший способ получить данные о времени?

Комментарии:

1. Show не принимает никаких аргументов

Ответ №1:

Проблема: кажется, что это AlarmPickerDialog распространяется из android.app.DialogFragment вместо android.support.v4.app.DialogFragment .

Решение: измените свой код на

 // Comment-out this line
// import android.app.DialogFragment

// Add this line
import android.support.v4.app.DialogFragment

class AlarmPickerDialog : DialogFragment() {

    override fun onCreateView(inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle?): View? {
        var myView = inflater!!.inflate(R.layout.alarm_time_picker, container, false)
        return myView
    }
}
  

Ответ №2:

Эй, попробуйте выполнить эти шаги,https://developer.android.com/reference/android/app/DialogFragment в вашем вопросе говорится, как вызвать fragment manager, но вы уже вызываете его, вот почему ваш вопрос не настолько устраняет проблему, и попробуйте следовать этим документам, возможно, это поможет.

Комментарии:

1. здравствуйте, мой код не компилируется с этим .show() вызовом, поэтому я еще не вызывал FragmentManager.

Ответ №3:

Вот решение для вашего кода:

Код для диалогового фрагмента

 class ListFragment: DialogFragment() {

    override fun onCreateView(inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle?): View? {
        val rootView = inflater.inflate(R.layout.list_layout, container)
        var pioneers = arrayOf("Jon Snow", "Mother of Dragon-Khalessi", "Ned Stark", "Benjen Stark", "Cathlyen Stark", "Arya Stark", "Sansa Stark", "Littelfiger", "Jamie Lannister")

        val myListView = rootView.findViewById(R.id.myListView) as ListView
        myListView!!.adapter = ArrayAdapter<String>(activity, android.R.layout.simple_list_item_1, pioneers)

        this.dialog.setTitle("Game Of Thrones")

        myListView.setOnItemClickListener {
            adapterView,
            view,
            position,
            l
            -> Toast.makeText(activity, pioneers[position], Toast.LENGTH_SHORT).show()
        }

        return rootView
    }
}


In your activity you can make call something like this

val openFragmentBtn = findViewById<Button>(R.id.openFragmentID)

//On button Click Open Dialog Fragment
    val openFragmentBtn = findViewById(R.id.openFragmentID) as Button

            val fm = supportFragmentManager
            val listFragment= ListFragment()

            openFragmentBtn.setOnClickListener(object : View.OnClickListener {
                override fun onClick(view: View) {
                    listFragment.show(fm, "PioneersFragment_tag")
                }
            })
  

Попробуй это

 val pop = alarm_first()
val fm = this@YourActivityName.fragmentManager
pop.show(fm, "name")
  

Я внедрил этот код в целях обучения, но если у вас это сработает, я рад помочь

Комментарии:

1. Спасибо за ваш ответ! К сожалению, я пробовал это, но это не работает во fragment.

2. Во фрагменте kotlin нет supportFragmentManager