Котлин: открыть новое действие внутри фрагмента

Как с помощью кнопки открыть новое действие внутри фрагмента?

Я пробовал это

override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
    super.onViewCreated(view, savedInstanceState)

    LogOut_btn.setOnClickListener {
        //FirebaseAuth.getInstance().signOut()
        val intent = Intent (this, Main::class.java)
        startActivity(intent)            
    }
}

val intent = Intent doesn't seem to work in a fragment.

Есть идеи, как я могу начать новую деятельность внутри фрагмента?

getActivity().startActivity(intent)
EpicPandaForce 17.11.2018 23:09
13
1
35 518
15
Перейти к ответу Данный вопрос помечен как решенный

Ответы 15

Я считаю, что это будет что-то вроде

activity?.let { callingActivity -> startActivity(Intent(callingActivity, Main::class.java)) }

Вы должны использовать вызывающие действия context

Спасибо за ваши усилия, но приложение по-прежнему вылетает

L. Busekrus 18.11.2018 15:52

Ваш код почти готов, вам просто нужно передать экземпляр фрагмента в качестве первого параметра Intent, заменив YourFragmentName на имя вашего фрагмента после @, ниже:

val intent = Intent ([email protected], Main::class.java)
startActivity(intent)

Взгляните на этот образец ниже:

class MyFragment: Fragment(){

    override fun onActivityCreated(savedInstanceState: Bundle?) {
        super.onActivityCreated(savedInstanceState)

        val intent = Intent ([email protected], YOUR_NEXT_ACTIVITY_CLASS::class.java)
        startActivity(intent)
    }
}

Прежде всего, я хочу поблагодарить вас за попытку помочь мне, но когда я помещаю туда свое имя фрагмента, намерение перестает работать и становится красным подчеркиванием.

L. Busekrus 18.11.2018 15:53

извините, он все еще рушится. Должен ли я даже ездить на этом в увлекательной игре на ViewCreated или в чем-то еще. Может, не надо так делать с фрагментом

L. Busekrus 18.11.2018 18:18

Я добавил еще один образец

Pedro Massango 19.11.2018 10:33

Почему именно class.java для вашего следующего занятия? Я думал, мы написали это на котлине?

Adan Vivero 24.11.2021 22:46
Ответ принят как подходящий

Поскольку Fragment НЕ относится к типу Context, вам необходимо вызвать родительский Activity:

 val intent = Intent (getActivity(), Main::class.java)
 getActivity().startActivity(intent)

или может что-то вроде

activity?.let{
    val intent = Intent (it, Main::class.java)
    it.startActivity(intent)
}

Спасибо за ваше предложение, но приложение по-прежнему вылетает, когда я открываю действие, в котором показан фрагмент, начинается

L. Busekrus 18.11.2018 15:51

Какое исключение вы получаете? может вы забыли указать активность в манифесте?

dasfima 18.11.2018 18:45

Я самый тупой человек во вселенной. У меня есть 3 фрагмента и я все время писал не в том. Очень сожалею о моей глупости. Спасибо за помощь мне

L. Busekrus 18.11.2018 19:08

Неа. ты просто еще один человек во вселенной. ?

dasfima 18.11.2018 19:11

Спасибо @dasfima, все еще отлично работает !!

Zachary Smouse 31.10.2021 02:21

Это не работает для меня. Может быть, у меня фрагмент не кнопка?

Adan Vivero 24.11.2021 23:12

Если вы используете только activity, возвращает только экземпляр Activity. Это может быть любое действие, которое включает ваш фрагмент, поэтому в некоторых случаях вы можете получить FragmentActivity вместо родительского действия. Используйте это, чтобы убедиться, что вы получаете правильный:

(activity as? YourParentActivity)?.let{
    val intent = Intent (it, Main::class.java)
    it.startActivity(intent)
}

Вам необходимо переместить ?, иначе это вызовет исключение приведения, когда этот фрагмент прикреплен к чему-то другому, кроме YourParentActivity.. Используйте (activity as? YourParentActivity). И, конечно, нам нужно вообще приведение типов только в том случае, если нам нужно вызвать функцию, которая является конкретным методом YourParentActivity.

Tenfour04 16.09.2021 16:16

Вы совершенно правы @ Tenfour04. Спасибо за предложение :)

Noelia 24.09.2021 15:46

Тоже вариант (для котлина). В onCreateView установите onClickListener для кнопки:

button.setOnClickListener {
    requireActivity().run {
        startActivity(Intent(this, MainActivity::class.java))
        finish() // If activity no more needed in back stack
    }
}

Положи это

LogOut_btn.setOnClickListener {
        //FirebaseAuth.getInstance().signOut()
         val intent = Intent (this, Main::class.java)
        startActivity(intent)



    }

внутри метода onCreate Activity, в который загружается фрагмент

Вместо этого попробуйте получить контекст из фрагмента

override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
  super.onViewCreated(view, savedInstanceState)

  LogOut_btn.setOnClickListener {
    //FirebaseAuth.getInstance().signOut()
     val intent = Intent (view.context, Main::class.java)
    startActivity(intent)
  }
}
val intent = Intent (getActivity(), NextActivity::class.java)
getActivity()?.startActivity(intent)

Это сделает работу.

getActivity (), взятый из фрагмента и getActivity ()? чтобы избежать НПЭ

Надеюсь, поможет :)

Хотя этот код может решить вопрос, включая объяснение о том, как и почему это решает проблему, действительно поможет улучшить качество вашего сообщения и, вероятно, приведет к большему количеству голосов за. Помните, что вы отвечаете на вопрос для будущих читателей, а не только для человека, который задает его сейчас. Пожалуйста, редактировать свой ответ, чтобы добавить пояснения и указать, какие ограничения и предположения применяются.

rizerphe 10.05.2020 07:20

Богдан Опир бесполезно tbh.

pentexnyx 10.05.2020 16:47

FirebaseAuth.getInstance (). SignOut () перед намерением.

Ты можешь делать что-то подобное в Котлине

YourButton.setOnClickListener{
            requireActivity().run{
                startActivity(Intent(this, NeededActivity::class.java))
                finish()
            }
        }

Для меня я просто сделал это, и это сработало

val intent = Intent(AppName.applicationContext(), YourAppName::class.java)
activity?.startActivity(intent)

Вы можете добавить этот код в свой фрагмент

AppName

Это имя приложения, которое содержит глобальный объект-компаньон, например context.

Вот решение, которое я нашел, пытаясь заставить что-то подобное работать.

view.findViewById<Button>(R.id.button_second).setOnClickListener {
  val i = Intent(activity, ClassNameOfActivityIWantToGoTo::class.java)
  activity?.startActivity(i)
}
val  intent = Intent(activity, AttachmentActivity::class.java)
            activity!!.startActivity(intent)
             activity!!.finish()
 override fun onCreateView(
    inflater: LayoutInflater, container: ViewGroup?,
    savedInstanceState: Bundle?
): View? {
    // Inflate the layout for this fragment 

val view = inflater.inflate (R.layout.YourFragmentLayout, контейнер, ложь)

    view.button.setOnClickListener {
        val intent = Intent(requireContext(), YourActivity::class.java)
        startActivity(intent)

    }


    return view

}

 val intent = Intent (getActivity(), Main::class.java)
 getActivity().startActivity(intent)

Добро пожаловать в Stack Overflow! Хотя ваш ответ может решить вопрос, включая объяснение о том, как и почему это решает проблему, действительно поможет улучшить качество вашего сообщения и, вероятно, приведет к большему количеству голосов за. Помните, что вы отвечаете на вопрос для будущих читателей, а не только для человека, который задает его сейчас. Вы можете отредактировать свой ответ, чтобы добавить пояснения и указать, какие ограничения и предположения применяются. - Из обзора

Adam Marshall 15.02.2021 17:29

Другие вопросы по теме