Kotlin:在片段内打开新活动

Posted

技术标签:

【中文标题】Kotlin:在片段内打开新活动【英文标题】:Kotlin: open new Activity inside of a Fragment 【发布时间】:2019-04-20 16:48:36 【问题描述】:

使用按钮时如何在片段内打开新的 Activity?

我试过了

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 似乎在片段中不起作用。

知道如何在片段中启动新活动吗?

【问题讨论】:

getActivity().startActivity(intent) 【参考方案1】:

因为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)

【讨论】:

感谢您的建议,但当我打开显示片段的活动时,应用程序仍然崩溃 您遇到了什么异常?也许你忘了在清单中声明活动? 我是全宇宙最笨的人。我有 3 个片段,但我一直写错一个。真的很抱歉我的愚蠢。谢谢你帮助我 不。你只是宇宙中的另一个人。 ? 谢谢@dasfima,仍然可以完美运行!!【参考方案2】:

你可以在 kotlin 中这样做

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

【讨论】:

【参考方案3】:

您的代码几乎完成了,您只需将片段实例作为 Intent 的第一个参数传递,将 YourFragmentName 替换为 @ 后面的片段名称,如下:

val intent = Intent (this@YourFragmentName.context, Main::class.java)
startActivity(intent)

请看下面的示例:

class MyFragment: Fragment()

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

        val intent = Intent (this@MyFragment.context, YOUR_NEXT_ACTIVITY_CLASS::class.java)
        startActivity(intent)
    

【讨论】:

首先我要感谢您尝试帮助我,但是当我将片段名称放入其中时,Intent 停止工作并出现红色下划线。 抱歉,它仍然在崩溃。我什至应该在覆盖有趣的 onViewCreated 或其他东西中使用它。也许我不应该对片段这样做 我添加了另一个样本 为什么你的下一个活动类是class.java?我以为我们是用 kotlin 写的?【参考方案4】:

对我来说,我只是这样做了,它奏效了

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

您可以将此代码添加到您的片段中

AppName

这是包含全局伴随对象的应用程序名称,例如 context

【讨论】:

【参考方案5】:
val intent = Intent (getActivity(), NextActivity::class.java)
getActivity()?.startActivity(intent)

这样就可以了。

getActivity() 因为它是从 Fragment 和 getActivity() 转换而来的?避免NPE

希望对你有帮助:)

【讨论】:

虽然此代码可以解决问题,including an explanation 说明如何以及为什么解决问题将真正有助于提高您的帖子质量,并可能导致更多的赞成票。请记住,您正在为将来的读者回答问题,而不仅仅是现在提出问题的人。请edit您的回答添加解释并说明适用的限制和假设。 Богдан Опир 没有帮助。【参考方案6】:

如果您只使用activity,则只返回一个 Activity 实例。这可以是嵌入您的片段的任何活动,因此在某些情况下,您可以获得 FragmentActivity 而不是您的父活动。使用它来确保您得到正确的:

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

【讨论】:

您需要移动?,否则当此Fragment 附加到YourParentActivity. 以外的其他对象时,这将导致强制转换异常,请使用(activity as? YourParentActivity)。当然,如果我们需要调用 YourParentActivity 的特定方法的函数,我们只需要进行强制转换。 你是完全正确的@Tenfour04。谢谢你的建议:)【参考方案7】:

我相信会是这样的

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

你必须使用调用活动context

【讨论】:

感谢您的努力,但应用仍然崩溃【参考方案8】:

也是一个选项(对于 kotlin)。 在 onCreateView 中为一个按钮设置 onClickListener:

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

【讨论】:

【参考方案9】:

放这个

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



    

在加载片段的Activity的onCreate方法中

【讨论】:

【参考方案10】:

尝试从片段中获取上下文

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)
  

【讨论】:

【参考方案11】:

FirebaseAuth.getInstance().signOut() 在意图之前。

【讨论】:

【参考方案12】:

这是我在尝试获得类似工作时找到的解决方案。

view.findViewById<Button>(R.id.button_second).setOnClickListener 
  val i = Intent(activity, ClassNameOfActivityIWantToGoTo::class.java)
  activity?.startActivity(i)

【讨论】:

【参考方案13】:
val  intent = Intent(activity, AttachmentActivity::class.java)
            activity!!.startActivity(intent)
             activity!!.finish()

【讨论】:

【参考方案14】:
 val intent = Intent (getActivity(), Main::class.java)
 getActivity().startActivity(intent)

【讨论】:

欢迎来到 Stack Overflow!虽然您的回答可能会解决问题,但 including an explanation 关于如何以及为什么解决问题将真正有助于提高您的帖子质量,并可能导致更多的赞成票。请记住,您正在为将来的读者回答问题,而不仅仅是现在提问的人。您可以编辑您的答案以添加解释并指出适用的限制和假设。 - From Review【参考方案15】:
 override fun onCreateView(
    inflater: LayoutInflater, container: ViewGroup?,
    savedInstanceState: Bundle?
): View? 
    // Inflate the layout for this fragment 

val view = inflater.inflate(R.layout.YourFragmentLayout, container, false)

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

    


    return view

【讨论】:

以上是关于Kotlin:在片段内打开新活动的主要内容,如果未能解决你的问题,请参考以下文章

片段内 Spinner 的 Kotlin 问题

将接口从片段传递到kotlin中的活动

从片段中的按钮单击打开导航抽屉(Kotlin)

如何在 Kotlin 中创建一个打开新活动(Android Studio)的按钮?

Kotlin 相同片段多个活动

使用地图片段(kotlin)时,活动在充气时崩溃