【问题标题】:Get data from viewpager fragments从 viewpager 片段中获取数据
【发布时间】:2016-08-18 18:17:54
【问题描述】:

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

【问题讨论】:

    标签: android android-fragments android-viewpager android-fragmentactivity


    【解决方案1】:

    我刚刚开发了一个具有相同用例的应用程序。此外,我还必须将数据保存在后退导航中。这个问题比我应该的要困难一些。问题来自这样一个事实,即并非 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 中的对象。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多