从 viewpager 片段中获取数据

Get data from viewpager fragments

我有一个 Activity,其中有一个 保存 详细信息按钮和一个 Viewpager,其中包含 4 个片段。 Fragments 包含用户详细信息表单。单击 Save 按钮后,我需要从所有片段中获取数据并保存详细信息。如何在 activity?

中单击 Save 按钮时获取用户在所有 4 个片段中输入的数据

我刚刚开发了一个具有相同用例的应用程序。此外,我还必须将数据保存在后退导航中。这个问题比我想象的要难一些。问题来自这样一个事实,即并非 ViewPager 中的所有片段都保证存活。它们可能尚未启动,或者在用户调出它们时被销毁。

为了解决这个问题,我从这个blog post关于处理后退事件中获得了灵感。我不得不稍微修改它以允许任何可能 运行 而不仅仅是一个的片段。

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

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

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 视图中复制数据并将它们保存回 Activity.

中的对象