在 Kotlin 中将值从 Activity 传递到 Fragment

6 android android-layout android-fragments kotlin

我在我的项目中创建了一个底部导航活动,其中包含一个活动和两个片段。在主活动中,我将值存储在一个变量中,但是如果我将值传递给片段,则会出现 NullPointer 异常错误。我在我的项目中使用 kotlin,任何帮助表示赞赏。 期待

Get Value into Fragment from MainActivity. MainActivity--->TestOneFragment
Run Code Online (Sandbox Code Playgroud)

使用的语言

Kotlin
Run Code Online (Sandbox Code Playgroud)

主要活动

class Test : AppCompatActivity(), BottomNavigationView.OnNavigationItemSelectedListener
{
    private val KEY_POSITION = "keyPosition"
    private var navPosition: BottomNavigationPosition = BottomNavigationPosition.ONE
    private lateinit var toolbar: Toolbar
    private lateinit var bottomNavigation: BottomNavigationView

    override fun onCreate(savedInstanceState: Bundle?)
    {
        super.onCreate(savedInstanceState)
        restoreSaveInstanceState(savedInstanceState)
        setContentView(R.layout.activity_test)
        toolbar = findViewById(R.id.toolbar)
        bottomNavigation = findViewById(R.id.bottom_navigation)
        setSupportActionBar(toolbar)
        initBottomNavigation()
        initFragment(savedInstanceState)
        var Name:String=intent.getStringExtra("name")
        println("Test CLLicked: $Name")


        //This code is to pass the value to Fragment
        var bundle=Bundle()
        bundle.putString("name",Name)
        var frag=TestFragment()
        frag.arguments=bundle
    }

    override fun onSaveInstanceState(outState: Bundle?)
    {
        outState?.putInt(KEY_POSITION, navPosition.id)
        super.onSaveInstanceState(outState)
    }

    override fun onNavigationItemSelected(item: MenuItem): Boolean
    {
        navPosition = findNavigationPositionById(item.itemId)
        return switchFragment(navPosition)
    }

    private fun restoreSaveInstanceState(savedInstanceState: Bundle?)
    {
        savedInstanceState?.also {
            val id = it.getInt(KEY_POSITION, BottomNavigationPosition.ONE.id)
            navPosition = findNavigationPositionById(id)
        }
    }

    private fun initBottomNavigation()
    {
        bottomNavigation.active(navPosition.position)
        bottomNavigation.setOnNavigationItemSelectedListener(this)
    }

    private fun initFragment(savedInstanceState: Bundle?)
    {
        savedInstanceState ?: switchFragment(BottomNavigationPosition.ONE)
    private fun switchFragment(navPosition: BottomNavigationPosition): Boolean {
        return supportFragmentManager.findFragment(navPosition).let {
            if (it.isAdded) return false
            supportFragmentManager.detach() // Extension function
            supportFragmentManager.attach(it, navPosition.getTag()) // Extension function
            supportFragmentManager.executePendingTransactions()
        }
    }
    private fun FragmentManager.findFragment(position: BottomNavigationPosition): Fragment
    {
        return findFragmentByTag(position.getTag()) ?: position.createFragment()
    }
}
Run Code Online (Sandbox Code Playgroud)

测试片段

 override fun onCreateView(inflater: LayoutInflater, container: ViewGroup?,savedInstanceState: Bundle?): View? {
    val testName= arguments!!.getString("name")
....
}
Run Code Online (Sandbox Code Playgroud)

错误

kotlin.KotlinNullPointerException
        at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2778)
        at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2856)
        at android.app.ActivityThread.-wrap11(Unknown Source:0)
        at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1589)
Run Code Online (Sandbox Code Playgroud)

Adv*_*Dog 10

这是newInstance创建Fragments.

这是在 a 中companion object,这几乎只是说“这些东西是静态的”的一种方式。

首先,你应该为你的Bundle名字定义常量,这将有助于保持一切对齐。接下来,定义一个newInstance接受您的参数的方法,例如name.

在那里,您将创建Fragment并返回它。这样,您Activity不必担心Bundle或任何事情。您所有的逻辑都在一个地方,用于存储/检索,都在您的Fragment.

class TestOneFragment {

    companion object {
        const val ARG_NAME = "name"


        fun newInstance(name: String): TestOneFragment {
            val fragment = TestOneFragment()

            val bundle = Bundle().apply {
                putString(ARG_NAME, name)
            }

            fragment.arguments = bundle

            return fragment
        }
    }

    override fun onCreateView(inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle?): View? {
        val name = arguments?.getString(ARG_NAME)
        // ...
    }
}
Run Code Online (Sandbox Code Playgroud)

现在,您可以Fragment通过执行以下操作轻松获得。

class Test : AppCompatActivity(), BottomNavigationView.OnNavigationItemSelectedListener {

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

        val name = intent.getStringExtra("name")

        // Creating the new Fragment with the name passed in.
        val fragment = TestFragment.newInstance(name)
    }

}
Run Code Online (Sandbox Code Playgroud)

希望这有帮助!