Начать фрагмент с деятельности

Я могу начать фрагмент из действия. Однако я беспокоюсь о потенциальных проблемах с моей реализацией.

У меня есть два фрагмента, FragmentA а также FragmentBИ у меня есть 3 класса активности, Activity1, Activity2, ResultActivity

public class NavigationTabs extends FragmentActivity {
  @Override
  protected void onCreate(Bundle savedInstanceState) {

    super.onCreate(savedInstanceState);
    setContentView(R.layout.simple_tabs_2);

    FragmentStatePagerAdapter adapter = new MyTabs(getSupportFragmentManager());
    ....
    ....
 }

 static class MyTabs extends FragmentStatePagerAdapter {
    public MyTabs(FragmentManager fm) {
        super(fm);
    }

    @Override
    public Fragment getItem(int position) {
        switch(position)
        {
                case 0:

                     FragmentA FragA = new FragmentA();  
                     return FragA;

                 case 1:

                     FragmentB FragB = new FragmentB();  
                     return FragB;
      ......
      ......
      }
  }

^ Как я звоню FragmentA а также FragmentB

FragmentA начинается Activity1 через намерение.

    Intent intent = new Intent(getActivity(), Activity1.class);
    startActivity(intent);

Activity1 затем передает результаты счетчика ResultActivity

ResultActivity начинается (или возвращается к) FragmentA и устанавливает SharedPreferences через onClick, как это

public void onClick(View v) {
   if(v.getId()== R.id.button_1){
      SharedPreferences sp = PreferenceManager.getDefaultSharedPreferences(this);
      Editor edit = sp.edit();
      edit.putInt(passedSavePref, counter);
      edit.commit();

      finish();
}
}

FragmentB начинается Activity2 через намерение.

Intent intent = new Intent(getActivity(), Activity2.class);
    startActivity(intent);

Activity2 затем передает результаты счетчика ResultActivity

ResultActivity начинается (возвращается) FragmentB и устанавливает SharedPreferences через onClick, как это

   public void onClick(View v) {
   if(v.getId()== R.id.button_1){
      SharedPreferences sp = PreferenceManager.getDefaultSharedPreferences(this);
      Editor edit = sp.edit();
      edit.putInt(passedSavePref, counter);
      edit.commit();

      finish();
}
}

Это все работает для моих нужд. GC вроде нормально, его освобождают и выделяют память.

ResultActivty возвращается к правильному фрагменту, и он правильно устанавливает SavedPreferences.

Все же это кажется очень плохой реализацией. Для начала, при поиске других вопросов, которые я прочитал, "Не запускайте действие непосредственно из фрагмента", постер также был связан с правильной реализацией здесь https://developer.android.com/guide/components/fragments.html

Я пробовал звонить Activity1 от FragmentA как это, но я не вижу разницы в поведении или производительности

  Intent intent = new Intent(getActivity(), Activity1.class);
  startActivity(intent);
  getActivity().getSupportFragmentManager().popBackStack();

Так что мой вопрос, мне нужно закончить / удалить FragmentA когда я начну Activity1затем начните FragmentA снова из ResultActivityиспользуя что-то вроде

 FragmentTransaction transaction = getFragmentManager().beginTransaction();

Заранее спасибо.

РЕДАКТИРОВАТЬ Так что я пытался убить / закончить / поп FragmentA чтобы я мог перезапустить его с ResultActivity, Причина, по которой я пытался это сделать, заключалась в том, что мои сохраненные ссылки не загружались, когда я возвращался в FragmentA от ResultActivity(хорошо они сохранялись и загружались правильно, но я их не видел)

Как я понимаю из документов, фрагменты идут на паузу. Так что вызывая мой метод loadPreferences onResume(); загрузил мои SavedPreferences.

Не отмечать это как ответ, потому что я не внедрил ни одну стандартную / надлежащую практику работы с Фрагментами popBackStack();FragmentTransactions так далее

1 ответ

Решение
  1. Цитата: "Не начинайте деятельность непосредственно с фрагмента"

Я прочитал плакат, который написал это, и я категорически не согласен. Его обоснование заключается в том, что это уменьшает модульность фрагмента, и он считает, что вы должны заставить интерфейс вызывать действия.

Я не согласен. Это не уменьшает модульность, фактически это увеличивает. Зачем реализовывать слой абстракции, чтобы делать что-то, что фрагмент должен делать в каждой реализации? Зачем переписывать один и тот же код в каждом упражнении, если его можно модулировать во фрагменте? На самом деле фрагменты не будут иметь своих собственных специализированных функций для запуска действий, если это противоречит принципам проектирования.

Например, если вы запускаете действие с помощью frag.startAcitivtyForResult(), фрагмент помещается непосредственно как получатель onActivityResult. Это не так, если вы используете свой экземпляр активности для непосредственного запуска нового действия.

  1. Вам не нужно удалять фрагменты перед началом нового действия

Android приостановит / остановит ваши фрагменты и, возможно, уничтожит их и основную деятельность. Android постоянно уничтожает и воссоздает действия и фрагменты, как каждый раз, когда вы меняете ориентацию на экране - в настройках по умолчанию ваша активность и фрагменты совершают массовое самоубийство.

Вот почему такие функции, как OnSaveInstanceState(), так важны, потому что они позволяют вашим действиям и фрагментам возвращаться в сохраненное состояние. Общее правило программирования для Android - ваша деятельность / фрагменты должны быть в состоянии изящно реагировать на спонтанную смерть.

Другие вопросы по тегам