得到viewpager片段数据(Get data from viewpager fragments)

2019-09-28 03:47发布

我有一个Activity ,其具有储存详情按钮和Viewpager其含有4个片段。 该Fragments包含用户信息的形式。 一旦保存按钮被点击,我需要得到所有碎片数据和保存详细信息。 如何获得在所有4个片段,用户输入数据时点击该活动Save按钮?

Answer 1:

我只是工作的一个应用程序,具有相同的使用情况。 此外,我不得不救上一回导航数据也是如此。 问题是有点难度,我虽然它应有的水平。 这些问题的事实是,并非所有的ViewPager的片段,保证是活着出来。 他们要么可能还没有开始呢,或者销毁当用户关闭寻呼他们。

为了解决这个问题,我把灵感来自于这个博客帖子大约交还压事件。 我不得不稍作修改,以便对可能正在运行的不只是一个任何片段。

public abstract class BackHandledFragment extends Fragment {
   protected BackHandlerInterface backHandlerInterface;
   public abstract String getTagText();
   public abstract boolean onBackPressed();

   @Override
   public void onCreate(Bundle savedInstanceState) {
      super.onCreate(savedInstanceState);
      if(!(getActivity()  instanceof BackHandlerInterface)) {
         throw new ClassCastException("Hosting activity must implement BackHandlerInterface");
      } else {
         backHandlerInterface = (BackHandlerInterface) getActivity();
      }
   }

   @Override
   public void onResume() {
      super.onResume();
      backHandlerInterface.addRunningFragment(this);
   }

   @Override
   public void onPause() {
      super.onPause();
      backHandlerInterface.removeRunningFragment(this);
   }

   public interface BackHandlerInterface {
      public void addRunningFragment(BackHandledFragment backHandledFragment);
      public void removeRunningFragment(BackHandledFragment backHandledFragment);
   }
}

活动实现接口并跟踪活性片段:

public class EditActivity implements BackHandledFragment.BackHandlerInterface
{
    private List<BackHandledFragment> listActiveFragments = new ArrayList<>

toolbar.setNavigationOnClickListener(new View.OnClickListener() {
         @Override
         public void onClick(View v) {

               // Notify each active fragment that the back was pressed, this will allow
               // them to save any data.
               for (BackHandledFragment bf : listActiveFragments) {
                  bf.onBackPressed();
               }
          }
@Override
   public void addRunningFragment(BackHandledFragment backHandledFragment) {
      listActiveFragments.add(backHandledFragment);
   }

   @Override
   public void removeRunningFragment(BackHandledFragment backHandledFragment) {
      listActiveFragments.remove(backHandledFragment);
   }();
}

每个片段必须扩展BackHandledFragment:

public class DetailNetworkFragment extends BackHandledFragment {
   @Override
   public void onPause() {
      super.onPause();
      EventBus.getDefault().unregister(this);
      saveDataFields();
   }

   @Override
   public void onResume() {
      super.onResume();
      EventBus.getDefault().register(this);

   }

   @Override
   public String getTagText() {
      return TAG;
   }

   @Override
   public boolean onBackPressed() {
      saveDataFields();
      return false;
   }
}

该saveDataFields()是不是太有趣了。 它只是复制出来的UI视图中的数据,并保存他们回到在活动的对象。



文章来源: Get data from viewpager fragments