android:循环继承,用于将验证/数据从动态ViewPager片段传递到活动

时间:2019-02-07 20:09:08

标签: android android-fragments android-viewpager

我正面临一个问题,希望对如何解决这个问题有一些见解。这是简短的说明

组件说明:

  1. 带有Activity和两个按钮的ViewPager
    • Add fragment按钮=>将具有相同布局的新片段添加到ViewPager
    • Continue按钮=>如果在所有片段中都验证了用户字段,请转到下一个屏幕
public class ParentActivity extends AppCompatActivity {
    private InputData mfirstProfileData;
    private ArrayList<InputData> mEditProfilesDataList = new ArrayList<>();
    ...
    private EditProfilePagerAdapter mPagerAdapter;
    private Button AddButton;
    private Button ContinueButton;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_parent);
        mFirstProfileData = new InputData();        
        ...

        mDotTabLayout.setupWithViewPager(mViewPager, true);
        mPagerAdapter = new EditProfilePagerAdapter(getSupportFragmentManager(),
                mViewPager, mDotTabLayout, mFirstProfileData);
        mViewPager.setAdapter(mPagerAdapter);

        mAddProfileBtn.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v ){ 
                // TODO: validate data and save in List<InputData> 
            addProfile(EditProfileFragment.newInstance(getNextPageNumber(), new InputData());          
            }
        });

        mContinueBtn.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v ){ 
                // TODO: validate data iff one EditProfileFragment and save in List<InputData> 
            sendToServer();          
            }
        });
    }
    ...
    public void addProfile(Fragment fragment) {
        mPagerAdapter.addFragment(fragment);
    }

    public void deleteProfile () {
        mPagerAdapter.deleteFragment();
    }

}

  1. 负责片段初始化的FragmentPagerAdapter负责动态添加/删除片段
public class EditProfilePagerAdapter extends FragmentPagerAdapter {
    private List<Fragment> fragments = new ArrayList<>();
    private ViewPager mViewPager;
    private TabLayout mDotTabLayout;

    public EditProfilePagerAdapter(FragmentManager fm, ViewPager viewPager, TabLayout tabLayout, InputData firstProfileInputData) {
        super(fm);
        fragments.add(EditProfileFragment.newInstance(0, firstProfileInputData));
        mViewPager = viewPager;
        mDotTabLayout = tabLayout;
    }

    public void addFragment (Fragment fragment) {
        fragments.add(fragment);
        notifyDataSetChanged();
        mDotTabLayout.setupWithViewPager(mViewPager);
        mViewPager.setCurrentItem(fragments.size() - 1);
    }

    public void deleteFragment () {
        if (mViewPager.getCurrentItem() != 0) {
            fragments.remove(mViewPager.getCurrentItem());
        }
        notifyDataSetChanged();
        mDotTabLayout.setupWithViewPager(mViewPager);
        mViewPager.setCurrentItem(fragments.size() - 1);
    }
    ...
}
  1. 配置文件Fragment,其中包含5个用户输入字段(EditTextsRadioButtonsDialogs)和一个按钮:
    • 删除=>从ViewPager中删除当前片段
public class EditProfileFragment extends Fragment {

    ... // bunch of user input fields
    private InputData mInputData;
    private int mPosition;
    private FloatingActionButton mDeleteBtn;

    public static EditProfileFragment newInstance(int position, InputData inputData) {
        EditProfileFragment fragment = new EditProfileFragment();
        Bundle args = new Bundle();
        args.putInt(KEY_POSITION, position);
        args.putParcelable(KEY_NEW_INPUT_DATA, inputData);
        fragment.setArguments(args);

        return fragment;
    }

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

        if (getArguments() != null) {
            mPosition = getArguments().getInt(KEY_POSITION, -1);
            mInputData = getArguments().getParcelable(KEY_NEW_INPUT_DATA);
        }
        ...
        // Take user input and save as mInputData.setName() etc.
        ...

        mDeleteBtn.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                // TODO: send mInputData back to ParentActivity so it can be removed from the List<InputData>
                ((ParentActivity) getActivity()).deleteProfile();
            }
        });


    }
    ...



}

用例:

  • 用户以1个片段开始进入“活动”。
  • 用户填写片段中的字段,其中一些是必填字段(基本验证),他可以在活动中按Add来添加另一个具有相同输入字段的配置文件片段。
  • 此外,用户还可以根据需要删除片段,每个片段本身都具有删除按钮。

IMO,我确定的将数据传递给活动的触发器是:

  • Add button 如果用户填充了当前片段并按下添加按钮以获取另一个编辑配置文件片段,那么如果验证成功,我们可以validate将来自当前片段的数据保存在活动中,并将其保存在List<InputData>中,否则,我们setError()在必填字段中缺少的字段上。

  • Continue button:如果用户只有1个个人资料(因为不必添加其他个人资料),我们可以检查用户是否在下一个屏幕之前按下了按钮,以进行验证

  • Delete button:如果用户删除个人资料,则会通知该活动,以便我们可以从List<InputData>.remove(mInputData)

  • 中删除该个人资料数据

我想同步用户输入的验证并将用户数据从每个片段发送到父活动

因此,最后,当用户按下Continue时,我得到一个List<InputData>,每个创建的用户片段一个。同样,如果用户在任何片段上按下Delete,则List<InputData>会更新以删除该片段的数据。

我应该如何安排它?

我尝试实现一个接口(在ParentActivityEditProfileFragment中,并监听onAddButtonPressed()(活动中的添加按钮)和onDeleteButtonPressed()(片段中的删除按钮),并结束了获得循环继承。任何帮助都将受到赞赏!

0 个答案:

没有答案