Kotlin在其主要活动的片段之间传递数据为空

时间:2018-03-12 18:10:31

标签: android android-intent kotlin android-tablayout

我很难将数据从主要活动传递到其片段。 这里的主要活动是ProductActivity.class,其中有两个片段使用tablayout使用Kotlin

使用bundle并设置为参数似乎不会被编译器视为错误,因为在创建新片段后字符串未保存或可能为null。

java.lang.NullPointerException: Attempt to invoke virtual method 'java.lang.String android.os.Bundle.getString(java.lang.String)' on a null object reference
                                                                      at my.hipi.hipiboutique.fragments.ProductPageFragment.onCreateView(ProductPageFragment.kt:22)

我正在使用这个字符串示例只是为了这个问题目的在两个片段之间传递,但基本上我使用的是json字符串。

ProductActivity

import android.support.v7.app.AppCompatActivity
import android.os.Bundle
import com.google.gson.Gson
import kotlinx.android.synthetic.main.activity_product.*
import my.hipi.hipiboutique.fragments.ProductPageFragment
import java.util.ArrayList

class ProductActivity : AppCompatActivity() {

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_product)

        val product1 = this.intent.getStringExtra("array")
        val fullProduct = Gson().fromJson(product1, Product::class.java)

        val testString : String = "example only"
        var bundle = Bundle()
        bundle.putString("test", testString)
        var frag = ProductPageFragment()
        frag.arguments = bundle

        viewPager_fragment.adapter = TabsAdapter(supportFragmentManager)
        tabLayout.setupWithViewPager(viewPager_fragment)

    }


}

这是TabsAdapter

import android.support.v4.app.Fragment
import android.support.v4.app.FragmentManager
import android.support.v4.app.FragmentPagerAdapter
import my.hipi.hipiboutique.fragments.ProductDetailFragment
import my.hipi.hipiboutique.fragments.ProductPageFragment

class TabsAdapter(manager: FragmentManager) : FragmentPagerAdapter (manager) {

    private val fragmentTitles = arrayOf("Product", "Details", "Contacts")

    override fun getItem(position: Int): Fragment {
        return when (position) {
            0 ->  ProductPageFragment()
            1 ->  ProductDetailFragment()
            //2 ->  ContactsFragment()
            else ->  ProductPageFragment()
        }
    }

    override fun getCount(): Int {
         return 3
    }

    override fun getPageTitle(position: Int): CharSequence {
        return fragmentTitles[position]
    }

}

这是ProductPageFragemnt.class

import android.os.Bundle
import android.support.v4.app.Fragment
import android.view.LayoutInflater
import android.view.View
import android.view.ViewGroup
import my.hipi.hipiboutique.R

class ProductPageFragment : Fragment() {
    override fun onCreateView(inflater: LayoutInflater?, container: ViewGroup?,
                              savedInstanceState: Bundle?): View? {
        // Inflate the layout for this fragment

        var gt = this.arguments.getString("test")
        println(gt)

        return inflater!!.inflate(R.layout.fragment_product_page, container, false)  
    }
}

如何将此数据字符串传递给两个片段。是可以传递给一个片段,但如果转到第二个选项卡,将导致空数据。我希望这两个片段都可以使用这些数据。谢谢。

1 个答案:

答案 0 :(得分:3)

ProductActivity中,您正在创建一个片段并设置其参数,但您没有对该片段执行任何操作。它被扔掉了:

val testString : String = "example only"
var bundle = Bundle()
bundle.putString("test", testString)
var frag = ProductPageFragment()
frag.arguments = bundle 

TabsAdapter中,您创建实际使用的片段,但您从未设置其参数:

override fun getItem(position: Int): Fragment {
    return when (position) {
        0 ->  ProductPageFragment()
        1 ->  ProductDetailFragment()
        //2 ->  ContactsFragment()
        else ->  ProductPageFragment()
    }
}

您可以删除代码的第一部分,但是您希望在适配器中应用相同的逻辑。也许是这样的:

override fun getItem(position: Int): Fragment {
    return when (position) {
        0 -> {
            var bundle = Bundle()
            bundle.putString("test", "some string here")
            var frag = ProductPageFragment()
            frag.arguments = bundle
            frag
        }
        ...
    }
}