【问题标题】:calling fragment method in Activity not working kotlin在 Activity 中调用片段方法不起作用 kotlin
【发布时间】:2021-05-15 12:08:09
【问题描述】:

我需要在activity中调用一个fragment方法......

FirstFragment.kt

class FirstFragment: Fragment() {

  fun getToast(context: Context) {
    return Toast.makeText(context, "hello", Toast.LENGTH_SHORT).show()
}

 }

MainActivity.kt

  class MainActivity: AppCompatActivity() {

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



    val transaction = supportFragmentManager.beginTransaction()
    transaction.replace(R.id.fragment_container, FirstFragment, FistFragmentTAG_NAME)
    transaction.commit()

     //expecting to use fragment method...
     parameter.getToast() //parameter is the code neede to call FirstFragment method .getToast()
    }


  }

我试过这3个案例都没有成功

  1. 我试过了:(它使应用程序崩溃)

      FirstFragment().getToast(this@MainActivity)
    
  2. 也试过了,但是函数.getToast()出现红色

    val myToast = supportFragmentManager.findFragmentByTag(FistFragmentTAG_NAME).getToast(this@MainActivity)
    
  3. 也试过了,但函数.getToast() 也显示为红色

       supportFragmentManager.fragments.forEach { it: Fragment
    
                     val getToast = it.getToast(this@MainActivity)
    

这里的问题不是context,因为实际上,我试图调用一个根本不使用上下文的方法...在这个例子中设置上下文只是为了调用Toast

如何调用片段方法??*

【问题讨论】:

  • 你能告诉我你到底面临什么问题吗?只需在片段上创建 1 个方法,并使用片段实例调用该方法从活动中。
  • 您能举个例子吗?我不知道如何在活动中实例化该方法...否则我也会尝试
  • 你能更新你的实际活动和片段代码吗?我将对其进行更新,以便您轻松理解。
  • 好的。您期望什么类型的更新?我发布了 3 种不同的解决方案,但均未成功。
  • 表示您如何从活动中添加片段。我猜你会使用片段管理器来添加或替换片段。

标签: android kotlin methods fragment


【解决方案1】:

这是活动课

class MyActivity : AppCompatActivity() {
    
        private lateinit var myFragment: FirstFragment
        override fun onCreate(savedInstanceState: Bundle?) {
            super.onCreate(savedInstanceState)
            setContentView(R.layout.activity_main)
    
            myFragment = FirstFragment()
            supportFragmentManager
                    .beginTransaction()
                    .add(R.id.fragment_container, myFragment , "MyFragment")
                    .commit()
    
            //this is fragment method, we call it from activity
            myFragment.getToast(this)
        }
    
    }

这是片段类

class FirstFragment: Fragment() {

    override fun onCreateView(inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle?): View? {
        return super.onCreateView(inflater, container, savedInstanceState)
    }

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

    fun getToast(context: Context) {
       Toast.makeText(context, "Hello", Toast.LENGTH_SHORT).show()
    }
}

【讨论】:

  • 你在做什么,不会和FirstFragment().getToast(this@MainActivity)一样吗?因为它在测试时也会使应用程序崩溃
  • 当您想要调用 getToast() 方法时。它应该基于一些动作,或者你在添加片段后直接调用它。
  • 你会崩溃。因为您试图在创建片段之前在片段中使用上下文。这里上下文为空。所以它会因为 NPE 而崩溃。
  • 是的,你的代码运行良好,只是我犯了一个我没有意识到的错误。谢谢。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-03-24
  • 1970-01-01
相关资源
最近更新 更多