2017-08-01 367 views
2

我是Android新手,尝试使用EventBus将消息从Fragment发送到其容器Activity。 不过,我得到错误:Kotlin不能正常工作的EventBus

D/EventBus: No subscribers registered for event class com.app.todo.controllers.task.TaskListFragment$TaskCreateSelectEvent 

以下是有关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') 
    } 
} 

任何想法我做错了什么?

+0

你在哪里调用'addFragment'方法? – Raghunandan

+0

'''addFragment'''尚未被调用。我曾打算调用它来添加更多片段。但目前,坚持要获得活动。 – Khawar

+0

我只是想澄清,如果任务列表片段是附加到活动。你的代码似乎很好,并尝试它自己工作 – Raghunandan

回答

1

I am new to Android ...

那么你应该更好地熟悉匕首和rx代替。 事件总线是一个坏东西在android上,并经常使事情比必要的更复杂。

https://www.google.de/search?q=android+rxjava+instead+of+eventbus

+0

谢谢你分享你的想法。即使我也计划与rx合作,但只是想为使用EventBus的应用快速创建MVP,因为它看起来很简单。 – Khawar

0

尝试改变你的订阅方法名:

onMessageEvent(event: TaskListFragment.TaskCreateSelectEvent) 

但随着@Lord闪存建议 - 使用rxjava代替eventbus。 Tkae看看PublishSubject/PublishProcessor(rx 2.0)类

+0

谢谢你的回复。我尝试了这一点,但没有奏效。不过,我会尝试rx的东西。 – Khawar

+0

方法名称与事件有什么关系?因为事件是在方法参数的基础上识别的。 –