【问题标题】:Kotlin pass data between fragment from it main activity is nullKotlin 在其主要活动的片段之间传递数据为空
【发布时间】:2018-03-12 18:10:30
【问题描述】:

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

使用 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 字符串。

产品活动

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

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

【问题讨论】:

    标签: android android-intent kotlin android-tablayout


    【解决方案1】:

    在您的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
            }
            ...
        }
    }
    

    【讨论】:

    • 是的,可以这样做,但是当滑动到第二个选项卡片段时,它会中断,因为第一个片段再次变为空。我想让这个字符串保留在两个片段中
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-04-03
    • 2018-09-25
    • 2016-02-11
    • 2016-11-21
    相关资源
    最近更新 更多