EventBus с Kotlin не работает
Я новичок в Android, и пытаюсь отправить сообщение из фрагмента в свой контейнер Activity с помощью EventBus. Однако я получаю сообщение об ошибке:
D/EventBus: No subscribers registered for event class com.app.todo.controllers.task.TaskListFragment$TaskCreateSelectEvent
Ниже приведен код в классе Activity, связанный с EventBus:
public class MainActivity : AppCompatActivity() {
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_main)
}
@Subscribe(threadMode = ThreadMode.MAIN)
fun onTaskCreateSelectEvent(event: TaskListFragment.TaskCreateSelectEvent) {
Log.d("TAG", "On Main Activity")
}
fun addFragment(fragment: Fragment) {
val transaction = supportFragmentManager.beginTransaction()
transaction.setCustomAnimations(R.anim.enter, R.anim.exit, R.anim.pop_enter, R.anim.pop_exit)
transaction.add(R.id.task_fragment_container, fragment)
transaction.addToBackStack(fragment.javaClass.simpleName)
transaction.commit()
}
public override fun onStart() {
super.onStart()
EventBus.getDefault().register(this)
}
public override fun onStop() {
super.onStop()
EventBus.getDefault().unregister(this)
}
}
Следующее находится в классе фрагмента
public class TaskListFragment : Fragment() {
private var fab: FloatingActionButton? = null
public class TaskCreateSelectEvent {
var fab: FloatingActionButton? = null
}
override fun onCreateView(inflater: LayoutInflater?, container: ViewGroup?, savedInstanceState: Bundle?): View? {
var view = inflater!!.inflate(R.layout.task_list_fragment, container, false)
fab = view.findViewById<FloatingActionButton>(R.id.fab)
fab!!.setOnClickListener {
val selectEvent = TaskCreateSelectEvent()
EventBus.getDefault().post(selectEvent)
}
return view
}
}
Вот так библиотека добавляется в build.gradle
файл.
apply plugin: 'kotlin-kapt'
dependencies {
compile 'org.greenrobot:eventbus:3.0.0'
kapt 'org.greenrobot:eventbus-annotation-processor:3.0.1' }
kapt {
arguments {
arg('eventBusIndex', 'com.app.todo.controllers.MyEventBusIndex')
}
}
Есть идеи, что я делаю не так?
2 ответа
Я новичок в Android ...
тогда вам лучше познакомиться с Dagger и RX. Шины для событий - это плохо для Android, и они часто усложняют ситуацию, чем это необходимо.
https://www.google.de/search?q=android+rxjava+instead+of+eventbus
Попробуйте изменить имя подписанного метода на:
onMessageEvent(event: TaskListFragment.TaskCreateSelectEvent)
но, как подсказал @Lord Flash - используйте rxjava вместо eventbus. Ткэ взгляд на PublishSubject/PublishProcessor
(rx 2.0) классы