我有一个Activity
,其具有储存详情按钮和Viewpager
其含有4个片段。 该Fragments
包含用户信息的形式。 一旦保存按钮被点击,我需要得到所有碎片数据和保存详细信息。 如何获得在所有4个片段,用户输入数据时点击该活动Save按钮?
Answer 1:
我只是工作的一个应用程序,具有相同的使用情况。 此外,我不得不救上一回导航数据也是如此。 问题是有点难度,我虽然它应有的水平。 这些问题的事实是,并非所有的ViewPager的片段,保证是活着出来。 他们要么可能还没有开始呢,或者销毁当用户关闭寻呼他们。
为了解决这个问题,我把灵感来自于这个博客帖子大约交还压事件。 我不得不稍作修改,以便对可能正在运行的不只是一个任何片段。
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视图中的数据,并保存他们回到在活动的对象。
文章来源: Get data from viewpager fragments