1

listItemFragment 向 ItemDetailFragment 发布事件以刷新 UI。但是以前从未使用过 ItemDetailFragment,因此从未调用过 ItemDetailFragment 中的 register() 方法。所以我想知道listItemFragment中发布的事件是如何知道ItemDetailFragment中的onevent方法的。这是源代码:

package com.angeldevil.eventbusdemo;

import android.os.Bundle;
import android.support.v4.app.ListFragment;
import android.view.View;
import android.widget.ArrayAdapter;
import android.widget.ListView;

import com.angeldevil.eventbusdemo.Event.ItemListEvent;

import de.greenrobot.event.EventBus;

public class ItemListFragment extends ListFragment
{

@Override
public void onCreate(Bundle savedInstanceState)
{
    super.onCreate(savedInstanceState);
    // Register
    EventBus.getDefault().register(this);
}

@Override
public void onDestroy()
{
    super.onDestroy();
    // Unregister
    EventBus.getDefault().unregister(this);
}

@Override
public void onViewCreated(View view, Bundle savedInstanceState)
{
    super.onViewCreated(view, savedInstanceState);

    new Thread()
    {
        public void run()
        {
            try
            {
                Thread.sleep(2000); 

                EventBus.getDefault().post(new ItemListEvent(Item.ITEMS));
            } catch (InterruptedException e)
            {
                e.printStackTrace();
            }
        };
    }.start();
}

public void onEventMainThread(ItemListEvent event)
{
    setListAdapter(new ArrayAdapter<Item>(getActivity(),
            android.R.layout.simple_list_item_activated_1,
            android.R.id.text1, event.getItems()));
}

@Override
public void onListItemClick(ListView listView, View view, int position,
        long id)
{
    super.onListItemClick(listView, view, position, id);
    EventBus.getDefault().post(getListView().getItemAtPosition(position));
}

 }


ItemDetailFragment:

package com.angeldevil.eventbusdemo;

import android.os.Bundle;
import android.support.v4.app.Fragment;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.TextView;
import de.greenrobot.event.EventBus;

    public class ItemDetailFragment extends Fragment
{

private TextView tvDetail;

@Override
public void onCreate(Bundle savedInstanceState)
{
    super.onCreate(savedInstanceState);
    // register
    EventBus.getDefault().register(this);
}

@Override
public void onDestroy()
{
    super.onDestroy();
    // Unregister
    EventBus.getDefault().unregister(this);
}


public void onEventMainThread(Item item)
{
    if (item != null)
        tvDetail.setText(item.content);
}

@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
        Bundle savedInstanceState)
{
    View rootView = inflater.inflate(R.layout.fragment_item_detail,
            container, false);
    tvDetail = (TextView) rootView.findViewById(R.id.item_detail);
    return rootView;
}
}
4

1 回答 1

1

GreenRobot EventBus 使用反射来查找称为 onEvent 的方法,并将事件对象传递给具有匹配签名的对象。

于 2014-11-10T12:52:36.637 回答