1
我有一个Activity
它有一个保存详细信息按钮和一个Viewpager
其中包含4个片段。 Fragments
包含用户详细信息表单。一旦点击按钮,我需要从所有片段中获取数据并保存细节。如何在活动中点击保存按钮时,如何获取用户输入的所有4个片段中的数据?从viewpager片段获取数据
我有一个Activity
它有一个保存详细信息按钮和一个Viewpager
其中包含4个片段。 Fragments
包含用户详细信息表单。一旦点击按钮,我需要从所有片段中获取数据并保存细节。如何在活动中点击保存按钮时,如何获取用户输入的所有4个片段中的数据?从viewpager片段获取数据
我刚刚开发了一个具有相同用例的应用程序。另外,我还必须将数据保存在后导航中。我认为这个问题有点困难,尽管应该是这样。问题来自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);
}
}
的活度实现接口并跟踪活性片段:
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中的一个对象。