我正面临一个问题,希望对如何解决这个问题有一些见解。这是简短的说明
组件说明:
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();
}
}
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);
}
...
}
Fragment
,其中包含5个用户输入字段(EditTexts
,RadioButtons
,Dialogs
)和一个按钮:
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();
}
});
}
...
}
用例:
Add
来添加另一个具有相同输入字段的配置文件片段。 IMO,我确定的将数据传递给活动的触发器是:
Add button
如果用户填充了当前片段并按下添加按钮以获取另一个编辑配置文件片段,那么如果验证成功,我们可以validate
将来自当前片段的数据保存在活动中,并将其保存在List<InputData>
中,否则,我们setError()
在必填字段中缺少的字段上。
Continue button
:如果用户只有1个个人资料(因为不必添加其他个人资料),我们可以检查用户是否在下一个屏幕之前按下了按钮,以进行验证
Delete button
:如果用户删除个人资料,则会通知该活动,以便我们可以从List<InputData>.remove(mInputData)
我想同步用户输入的验证并将用户数据从每个片段发送到父活动
因此,最后,当用户按下Continue
时,我得到一个List<InputData>
,每个创建的用户片段一个。同样,如果用户在任何片段上按下Delete
,则List<InputData>
会更新以删除该片段的数据。
我应该如何安排它?
我尝试实现一个接口(在ParentActivity
和EditProfileFragment
中,并监听onAddButtonPressed()
(活动中的添加按钮)和onDeleteButtonPressed()
(片段中的删除按钮),并结束了获得循环继承。任何帮助都将受到赞赏!