【问题标题】:Kotlin: open new Activity inside of a FragmentKotlin:在片段内打开新活动
【发布时间】: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)

标签: android kotlin android-fragments android-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
                  

                  }

                  【讨论】:

                    猜你喜欢
                    • 1970-01-01
                    • 2023-03-28
                    • 1970-01-01
                    • 1970-01-01
                    • 1970-01-01
                    • 1970-01-01
                    • 1970-01-01
                    • 1970-01-01
                    • 1970-01-01
                    相关资源
                    最近更新 更多