2017-08-01 3 views
2

Ich bin neu in Android und versuchen, Nachricht von einem Fragment zu seinem Container Aktivität mit EventBus zu senden. Aber ich bin immer Fehler:EventBus mit Kotlin funktioniert nicht

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

Im Folgenden finden Sie den Code in der Klasse Aktivität zu EventBus bezogen werden:

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) 
    } 

} 

ist folgend in Fragment Klasse

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 
    } 
} 

Dies wird wie Bibliothek hinzugefügt in build.gradle Datei.

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') 
    } 
} 

Irgendeine Idee, was ich falsch mache?

+0

wo rufen Sie 'addFragment' Methode auf? – Raghunandan

+0

'' 'addFragment''' ist noch nicht aufgerufen. Ich hatte geplant, es zu nennen, um weitere Fragmente hinzuzufügen. Aber derzeit, stecken in das Ereignis zu bekommen. – Khawar

+0

Ich wollte nur klären, ob das Aufgabenlistenfragment an die Aktivität angehängt ist. Ihr Code scheint gut zu sein und probierte es selbst aus – Raghunandan

Antwort

1

I am new to Android ...

Dann sollten Sie sich besser mit dolch und rx vertraut machen. Event-Busse sind ein schlechtes Ding auf Android und machen oft die Dinge komplizierter als nötig.

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

+0

danke für das Teilen Ihrer Gedanken. Sogar ich plante, mit rx zu arbeiten, wollte aber nur einen schnellen MVP für eine App mit EventBus erstellen, da es einfach zu verwenden scheint. – Khawar

0

try abonnierten Methodennamen zu ändern:

onMessageEvent(event: TaskListFragment.TaskCreateSelectEvent) 

aber als die @Lord Blitz vorgeschlagen - Verwendung rxjava statt EventBus. Tkae einen Blick auf PublishSubject/PublishProcessor (rx 2.0) Klassen

+0

danke für die Antwort. Ich habe es versucht, aber es hat nicht so gut funktioniert. Ich werde jedoch versuchen, Dinge zu rixen. – Khawar

+0

Was hat Methodenname mit dem Ereignis zu tun? da das Ereignis auf der Basis des Methodenparameters erkannt wird. –

Verwandte Themen