Kotlin:微调器来自另一个片段的onItemSelectedListener

问题描述 投票:0回答:1

我有一个带有BottomNavigationView,Spinner和FrameLayout的片段,在FrameLayout中出现了一个带有BottomNavigationView.setOnNavigationItemSelectedListener的新片段,这是我的代码:

片段ValcuotaEvolFragment

class ValcuotaEvolFragment: Fragment() {
lateinit var fragment : Fragment
override fun onCreateView(inflater: LayoutInflater,container: ViewGroup?, savedInstanceState: Bundle?): View? {

    val root = inflater.inflate(R.layout.fragment_valcuota_evol, container, false)
    val menuBottom: BottomNavigationView = root.findViewById(R.id.nav_view_valcuota_evol)
    val spn : Spinner = root.findViewById(R.id.spnAFP)
    val db = DataBaseHandler(activity!!.applicationContext)
    val afpListName : ArrayList<String> = db.getAFPNames()
    fragment= ValcuotaChartFragment()
    val bundle = Bundle()
    spn.adapter= ArrayAdapter<String>(activity!!.applicationContext,android.R.layout.simple_spinner_dropdown_item,afpListName)
    spn.onItemSelectedListener = object : AdapterView.OnItemSelectedListener {
        override fun onItemSelected(parent: AdapterView<*>, view: View, position: Int, id: Long) {
            bundle.putString("afp",spn.selectedItem.toString())
        }
        override fun onNothingSelected(parent: AdapterView<*>) { }
    }

    menuBottom.setOnNavigationItemSelectedListener {
        menuItem ->
        when(menuItem.itemId){
                R.id.nav_evolcuota_chart -> {
                     fragment = ValcuotaChartFragment()
                }
                R.id.nav_evolcuota_data -> {
                    fragment = ValcuotaDataFragment()
                }
            }
        fragment.setArguments(bundle);
        val transaction = childFragmentManager.beginTransaction()
        transaction.replace(R.id.frame_valcuota_evol, fragment)
        transaction.addToBackStack(null)
        transaction.commit()
        true
    }
    fragment.setArguments(bundle);
    val transaction = childFragmentManager.beginTransaction()
    transaction.replace(R.id.frame_valcuota_evol, fragment)
    transaction.addToBackStack(null)
    transaction.commit()
    return root
}
}

我通过捆绑将值“ afp”传递给新片段,现在我需要新片段执行不同的操作,具体取决于我在ValcuotaEvolFragment微调器中选择的内容

这是我需要的:

class ValcuotaDataFragment : Fragment() {
override fun onCreateView(inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle?): View? {
    val root = inflater.inflate(R.layout.fragment_valcuota_data, container, false)
    val afp = arguments!!.getString("afp")

    if(afp == "something"){
    doSomething()
    else {
    doSomethingElse
    }

    return root
}
}

这实际上有效,但是只有当我在BottomNavigationView中更改项目时,才需要在Spinner中更改项目时有效,thx

编辑

EventBus解决方案运行良好,但是现在我在ValcuotaDataFragment中遇到了一个新问题,我有一个RecyclerView,所以现在我需要在Spinner中更改项目后填充RecyclerView,这是我现在的操作方式:

    val rcViewValcuota = root. findViewById(R.id.rc_valcuota_data) as RecyclerView 
var valcuota : MutableList<ValcuotaModel> 
val db = DataBaseHandler(activity!!.applicationContext) 
valcuota = db.getCompleteValCuota(spinnerData.selectedItem,"desc") 
rcViewValcuota.adapter= ContentValcuotaMonthlyAdapter(valcuota)

我无法从函数listenItemChange访问“ root”

android kotlin spinner
1个回答
0
投票

好的,因此,当您从微调器中选择其他项目时,除非您将数据传递给片段,否则片段不会意识到这一点。因此,为了通知片段,您可以根据需要实现接口。或我最喜欢的您可以使用EventBus库传递数据。

我将向您展示如何实现EventBus。

首先,添加EventBus依赖项是Gradle文件:

implementation 'org.greenrobot:eventbus:3.1.1'

现在可以创建一个数据类来传递数据,例如SpinnerData:

data class SpinnerData(val selectedItem:String) 

然后在您的itemSelected侦听器内部,使用EventBus传递数据:

spn.onItemSelectedListener = object : AdapterView.OnItemSelectedListener {
    override fun onItemSelected(parent: AdapterView<*>, view: View, position: Int, id: Long) {
        // bundle.putString("afp",spn.selectedItem.toString())
        //insted add following line
        EventBus.getDefault().post(SpinnerData(spn.selectedItem.toString()))
    }
    override fun onNothingSelected(parent: AdapterView<*>) { }
}

然后在ValcuotaDataFragment中添加以下内容:

@Subscribe
fun listenItemChange(spinnerData: SpinnerData){
    if (spinnerData.selectedItem == "something") {
        doSomething()
    } else {
        doSomethingElse()
    }
}

override fun onStart() {
    super.onStart()
    EventBus.getDefault().register(this)
}

override fun onStop() {
    EventBus.getDefault().unregister(this)
    super.onStop()
}

现在,无论何时更改微调器项目,Evenbus都会被触发并将数据传递到片段内部的Subscribed方法。

希望这会有所帮助,让我知道您是否被卡在某处。

编辑:

如果您的片段尚未初始化,则无法使用。

因此请将您的行保留在itemSelected侦听器内以供首次使用:

bundle.putString("afp",spn.selectedItem.toString())
© www.soinside.com 2019 - 2024. All rights reserved.