Android:视图寻呼机中片段之间的通信

时间:2014-07-20 15:18:10

标签: java android android-fragments android-viewpager android-sqlite

仅供参考,我一直在尝试按照这个问题的答案

Basic Communication between two fragments

我在Fragments ViewPager内有AdapterActionbar

我所拥有的是一个片段产生一些数据,这些数据可以(如果选择)插入到SQLite表中。 第二个Fragment只显示表中的所有数据,但是我试图在Fragment 1将数据插入SQLite表时进行一些通信。调用Fragment 2来刷新其选择查询(如再次执行查询)以自动显示最新数据。目前这是手动完成的按钮,我感觉不是很好。

这是interface 1

中的Fragment
onNumbersSavedListener mCallback;

public interface onNumbersSavedListener
{
    public void RequestQueryRefresh();
}


@Override
public void onAttach(Activity activity) {
    // TODO Auto-generated method stub
    super.onAttach(activity);

    try
    {
        mCallback = (onNumbersSavedListener) activity;
    }
    catch(ClassCastException e)
    {
        e.printStackTrace();
    }
}

这是包含Activity并实现ViewPager

的主interface
public class MainActivity extends FragmentActivity implements TabListener, GenerateFragment.onNumbersSavedListener

这是我遇到的主要问题,我没有片段的ID,上面链接中提到的答案就是这样。

@Override
public void RequestQueryRefresh() {
    // TODO Auto-generated method stub

}

TLDR:我只是在寻找一种简单明了的方法,只要Fragment 1保存到数据库中,片段2就会通过重新运行查询来更新其列表视图。

3 个答案:

答案 0 :(得分:2)

在此处查看有关otto lib的更多信息:http://square.github.io/otto/

<强>编辑:

public class FragmentA extends Fragment {

    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container,  Bundle savedInstanceState) {            

        return super.onCreateView(inflater, container, savedInstanceState);
    }

    public void saveData(){

        //save datas before
        BusProvider.getInstance().post(new EventUpdateOtto());
    }
}


public class EventUpdateOtto{

    public EventUpdateOtto(){
    }
}

public class FragmentB extends Fragment {


    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container,  Bundle savedInstanceState) {
        return super.onCreateView(inflater, container, savedInstanceState);
    }


    @Subscribe
    public void subUpdateList(EventUpdateOtto mEventUpdateOtto){
        //update yout list here
    }

    @Override
    public void onResume() {
        BusProvider.getInstance().register(this);
        super.onResume();
    }

    @Override
    public void onPause() {
        BusProvider.getInstance().unregister(this);
        super.onPause();
    }
}


public  class BusProvider {
      private static final Bus BUS = new Bus();

      public static Bus getInstance() {
        return BUS;
      }

      private BusProvider() {
        // No instances.
      }
}

答案 1 :(得分:0)

在您的情况下,您可以改善界面:

public interface onNumbersSavedListener
{
    public void RequestQueryRefresh(Bunde bundle/*or something other*/);
}

答案 2 :(得分:0)

如果您使用的是游标加载程序,则更改应自动反映在显示它的片段中。但是,每当表更改时想要立即更新的片段都可以注册为该表的观察者:

  // observer to the table
class MyObserver extends ContentObserver {

    final Handler mHandler;

    public MyObserver(Handler handler) {
        super(handler);
        // I used a handler to get back to my UI thread
        mHandler = handler;
    }

    @Override

    public void onChange(boolean selfChange) {

        this.onChange(selfChange, null);
    }

    @Override
    public void onChange(boolean selfChange, Uri uri) {

        Log.i(TAG, "MyObserver: onChange");
        // do what you want to do - this is what I implemented
        mHandler.post(myRunnable);
    }
}

然后,注册它:

  mHandler = new Handler();
  mObserver = new MyObserver(mHandler);
  ContentResolver resolver = getContext().getContentResolver();
  resolver.registerContentObserver(uri, false, mEventLogObserver);

然后另一个片段应该发出通知:

  getContext().getContentResolver().notifyChange(uri, null);

关键是uri - 一个人看着它,另一个人通知。