与Kotlin事件总线不工作
我是Android新手,尝试使用EventBus将消息从Fragment发送到其容器Activity。 但是,我收到错误:
D/EventBus: No subscribers registered for event class com.app.todo.controllers.task.TaskListFragment$TaskCreateSelectEvent
以下是与EventBus相关的Activity类中的代码:
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(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') } }
任何想法我做错了什么?
我是Android的新手…
那么你应该更好地熟悉匕首和rx。 事件总线在Android上是一件坏事 ,往往使事情变得比必要的更复杂。
https://www.google.de/search?q=android+rxjava+instead+of+eventbus
尝试将您的订阅方法名称更改为:
onMessageEvent(event: TaskListFragment.TaskCreateSelectEvent)
但@Lord Flash建议 – 使用rxjava而不是事件总线。 看看PublishSubject/PublishProcessor
(rx 2.0)类