如何管理数据传递?

时间:2017-01-25 09:05:31

标签: android android-fragments android-viewpager android-pageradapter fragmentstatepageradapter

我目前正在处理我的应用程序的模块1&设置它的设计我也想申请其他模块。

我在模块1中有以下元素

  1. MainActivity - > 3片段[A,B,C]
  2. 所有3个片段包含 - > ViewPager
  3. 每个ViewPager都有 - > 5片段[p,q,r,s,t]
  4. 所有ViewPager片段都是一种输入形式&想要将ViewPager的片段1中的数据分享到2到3到5.在片段5上,SAVE按钮启用可以保存数据。 (假设片段1-5表示p-t)
  5. 另一部分是片段1或者A就像容器一样,它具有ViewPager的代码来加载5个子片段&从顺序片段中获取数据&再过一步。
  6. 我的问题是,

    这似乎非常&想要这是正确的方法吗?还是我应该改变这种设计模式?而且,如果这种设计方法是正确的,那么我应该如何管理数据传递?

3 个答案:

答案 0 :(得分:0)

请记住,您将有不同的方法来做到这一点,没有一个是正确的只是更容易或更清洁。 所以,如果我是你,我会尝试分离域对象,并有一个数据模型和仅处理视图部分的视图。 对我来说,最好的方法是遵循MVVM模式,它可以为您提供很多控制,您可以在Google android数据库库文档中阅读它。

另一种方法是攻击它,比方说,有一个所有视图都可以访问的Singleton WorkFlowManager,并且包含所有数据和业务逻辑。 这样,Any Fragment / Activity可以检查是否设置了所有表单字段,并使“保存”按钮可见(例如)。 如果要使用事件更新视图,可以在Manager上创建自定义eventListener,并在填充完最后一个字段后立即触发FormFilledEvent(或类似)并让Fragment注册该事件以监听它,并制作Buttton可见。

这是一个用例,但您可以有多个

快乐的编码;)

答案 1 :(得分:0)

  

这似乎非常&想要这是正确的方法吗?   我应该改变这种设计模式

对我来说,这似乎有点过于复杂。我宁愿将ViewPager的所有5个片段保存为一个带有保存FAB /按钮的表单,以避免将数据从主片段传递到每个子片段。但是,在您描述的情况下,这可能导致非常长的形式,或者如果字段依赖于先前的形式,则可能导致太多的检查。

  

如果这种设计方法是正确的那么我应该如何管理数据   传递?

对于每个主Fragment,我将使用一个实现Parcelable的对象来处理从主片段上的数据库加载的整个子流,然后将其传递给子片段时间填写相应的字段。最后一个子片段负责将更新的对象保存到数据库,或者只是将其传递回主片段以进行保存

更新

我还没有测试过这段代码,但是这是我将数据从主片段传递到子片段的一种方式:

<强> MainFragment.java

public class MainFragment extends Fragment 
{    
    private MyObj myObj;
    private SubFragment currentFragment;

    @Nullable
    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup parent, Bundle savedInstanceState)
    {
        final View view = inflater.inflate(R.layout.fragment, parent, false);
        final ViewPager pager = (ViewPager) view.findViewById(R.id.pager);

        myObj = db.loadObject();
        pager.setAdapter(new MyPagerAdapter(getChildFragmentManager()));

        return view;
    }

    public static class MyPagerAdapter extends FragmentPagerAdapter
    {

        MyPagerAdapter(FragmentManager manager)
        {
            super(manager);
        }

        @Override
        public Fragment getItem(int position)
        {
            if(currentFragment != null) myObj = currentFragment.getMyObj();
            switch(position)
            {
               case 4: 
                   currentFragment = FragmentT.getInstance(myObj);
                   break;
               case 3: 
                   currentFragment =  FragmentS.getInstance(myObj);
                   break;
               case 2: 
                   currentFragment =  FragmentR.getInstance(myObj);
                   break;
               case 1: 
                   currentFragment = FragmentQ.getInstance(myObj);
                   break;
               case 0: 
               default: 
                   currentFragment = FragmentP.getInstance(myObj);
            }
            return currentFragmnet;
         }

         @Override
         public int getCount()
         {
            return 5;
         }

        @Override
        public CharSequence getPageTitle(int position)
        {
            return titles[position]; 
        }
    }
}

<强> SubFragment.java

public class SubFragment extends Fragment
{
    protected static final String ARGS = "args";

    protected MyObj myObj;

    @Override
    public void onCreate(Bundle savedInstanceState)
    {
        super.onCreate(savedInstanceState);

        final Bundle args = getArguments();
        if (args != null)
        {
            myObj = args.getParcelable(ARGS);
        }
    }

    public MyObj getMyObj()
    {
        return myObj;
    }
}

<强> FragmentP.java

public class FragmentP extends SubFragment
{        
    public static FragmentP getInstance(MyObj myObj)
    {
        final FragmentP fragment = new FragmentP();
        final Bundle args = new Bundle();
        args.putParcelable(ARGS, myObj);
        fragment.setArguments(args);
        return fragment;
    }

    ...
}

答案 2 :(得分:0)

这可以使用Observer设计模式来解决。使模型可观察并将所有ui组件注册为观察者更新。我建议RXjava来解决这个问题。