#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