1

У меня есть Activity, у которого есть . Сохраните подробнее кнопка и Viewpager, которая содержит 4 фрагмента. Fragments содержит форму сведений о пользователе. Как только нажата кнопка Сохранить. Мне нужно получить данные со всех фрагментов и сохранить детали. Как получить данные, введенные пользователем во всех 4 фрагментах, когда Сохранить нажата кнопка в действии?Получить данные из фрагментов зрителя

ответ

1

Я просто работал над приложением, которое имело такой же вариант использования. Кроме того, мне пришлось также сохранять данные на обратной навигации. Проблема была немного сложнее, чем я должен был. Проблемы возникли из-за того, что не все фрагменты в 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.