У меня есть Activity
, у которого есть . Сохраните подробнее кнопка и Viewpager
, которая содержит 4 фрагмента. Fragments
содержит форму сведений о пользователе. Как только нажата кнопка Сохранить. Мне нужно получить данные со всех фрагментов и сохранить детали. Как получить данные, введенные пользователем во всех 4 фрагментах, когда Сохранить нажата кнопка в действии?Получить данные из фрагментов зрителя
ответ
Я просто работал над приложением, которое имело такой же вариант использования. Кроме того, мне пришлось также сохранять данные на обратной навигации. Проблема была немного сложнее, чем я должен был. Проблемы возникли из-за того, что не все фрагменты в 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() не слишком интересно. Он просто копирует данные из представлений пользовательского интерфейса и сохраняет их обратно в объект в Activity.