我有一个带有BottomNavigationView,微调框和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
}
}
我通过Bundle将值“ 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中更改项目时有效。
编辑
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”
答案 0 :(得分:0)
好的,因此,当您从微调器中选择其他项目时,除非您将数据传递给片段,否则片段将不知道该项目。因此,为了通知片段,您可以根据需要实现接口。或者我最喜欢的是,您可以使用EventBus库传递数据。
我将向您展示如何实现EventBus。
首先,添加EventBus Dependency是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())