【问题标题】:Android: Communication between fragments in a view pagerAndroid:视图分页器中片段之间的通信
【发布时间】:2014-07-20 15:18:10
【问题描述】:

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

Basic Communication between two fragments

我在 ViewPager AdapterActionbar 中有 2 个 Fragments

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

这是我在Fragment 1 中的interface

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 保存到 DB 中,片段 2 通过重新运行其查询来更新其列表视图。

【问题讨论】:

  • 我相信解决您问题的最佳方法是使用 EventBus 作为 otto!
  • 我尝试了 Luksprog 指出的答案。我得到空指针异常。我会调查什么是 eventbus 并试一试
  • 我编辑了我的答案以纠正一些错误:)!你会喜欢的,EventBus 是一种向听众发送事件的简单方法,广播风格但更灵活! lib 其他类型,对此类事件有很好的解释EventBus

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


【解决方案1】:

在此处查看有关 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.
      }
}

【讨论】:

    【解决方案2】:

    在你的情况下,你可以改进你的界面:

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

    【讨论】:

      【解决方案3】:

      如果您使用的是光标加载器,则更改应自动反映在显示它的片段中。但是,只要表发生更改,希望立即更新的片段可以注册为该表的观察者:

        // 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 - 一个监视它,另一个通知。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2020-03-25
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2018-03-12
        相关资源
        最近更新 更多