在Kotlin中将值从Activity传递给Fragment

时间:2018-12-28 22:01:03

标签: android android-layout android-fragments kotlin

我在项目中创建了一个底部导航活动,其中包含一个活动和两个片段。在Main Activity中,我将值存储在变量中,但是如果将值传递给片段,则会收到NullPointer Exception错误。我在项目中使用kotlin,对您的帮助表示赞赏。 期望

Get Value into Fragment from MainActivity. MainActivity--->TestOneFragment

使用的语言

Kotlin

主要活动

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()
    }
}

TestOneFragment

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

错误

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)

1 个答案:

答案 0 :(得分:1)

以下是用于创建newInstance的{​​{1}}模式的示例。

这位于Fragments中,这几乎只是说“这些东西是静态的”的一种方式。

首先,您应该为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) // ... } }

Fragment

希望有帮助!