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:在片段内打开新活动的主要内容,如果未能解决你的问题,请参考以下文章