Почему показывать и скрывать фрагменты с помощью BottomNavigation представление не просыпается? - PullRequest
0 голосов
/ 23 июня 2018

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

Из-за этого я создаю все фрагменты и пытаюсь показать и скрыть их в контейнере фрагментов.

Это мой код: (Я пишу этот код с этой справкой )

public class MainActivity extends AppCompatActivity {

  private Fragment ideaFragment = IdeaFragment.newInstance();
  private Fragment articleFragment = ArticleFragment.newInstance();
  private Fragment videoFragment = VideoFragment.newInstance();
  private Fragment magFragment = MagFragment.newInstance();
  private Fragment mainListFragment = MainListFragment.newInstance();


  @Override
  protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(view);


    btmNavigationView.setSelectedItemId(R.id.nav_home);
    btmNavigationView.setOnNavigationItemSelectedListener(navListener);

    fm = ((FragmentActivity) activity).getSupportFragmentManager();

    MainPresenter mainPresenter = new MainPresenter((MainListContract.View) mainListFragment, appRepository);
    ArticlePresenter articlePresenter = new ArticlePresenter((ArticleContract.View) articleFragment, appRepository);
    IdeaPresenter ideaPresenter = new IdeaPresenter((IdeaContract.View) ideaFragment, appRepository);
    VideoPresenter videoPresenter = new VideoPresenter((VideoContract.View) videoFragment, appRepository);
    MagPresenter magPresenter = new MagPresenter((MagContract.View) magFragment, appRepository);


    fm.beginTransaction().add(R.id.fragment_container, magFragment, "5").commit();
    fm.beginTransaction().add(R.id.fragment_container, ideaFragment, "4").commit();
    fm.beginTransaction().add(R.id.fragment_container, videoFragment, "3").commit();
    fm.beginTransaction().add(R.id.fragment_container, articleFragment, "2").commit();
    fm.beginTransaction().add(R.id.fragment_container, mainListFragment, "1").commit();

  }

  //setting up bottom navigation menu
  BottomNavigationView.OnNavigationItemSelectedListener navListener = new BottomNavigationView.OnNavigationItemSelectedListener() {
    @Override
    public boolean onNavigationItemSelected(@NonNull MenuItem menuItem) {

      //Fragment currentFragment = ((FragmentActivity) activity).getSupportFragmentManager().findFragmentById(R.id.fragment_container);


      switch (menuItem.getItemId()) {

        case R.id.nav_home:

          if (active != mainListFragment)
            fm.beginTransaction().show(mainListFragment).commit();
          else
            fm.beginTransaction().hide(active).show(mainListFragment).commit();
          active = mainListFragment;


        case R.id.nav_article:

          if (active != articleFragment)
            fm.beginTransaction().show(articleFragment).commit();
          else
            fm.beginTransaction().hide(active).show(articleFragment).commit();
          active = articleFragment;


        case R.id.nav_video:

          if (active != videoFragment)
            fm.beginTransaction().show(videoFragment).commit();
          else
            fm.beginTransaction().hide(active).show(videoFragment).commit();
          active = videoFragment;


        case R.id.nav_idea:

          if (active != ideaFragment)
            fm.beginTransaction().show(ideaFragment).commit();
          else
            fm.beginTransaction().hide(active).show(ideaFragment).commit();
          active = ideaFragment;


        case R.id.nav_mag:

          if (active != magFragment)
            fm.beginTransaction().show(magFragment).commit();
          else
            fm.beginTransaction().hide(active).show(magFragment).commit();
          active = magFragment;

      }

      return true;
    }
  };
}

Моя проблема в том, что MainListFragment будет отображаться при открытии приложения, но при попытке перейти к другим фрагментам ничего не происходит! И MainListFragment не изменится!

Где я не прав?

Спасибо за ваши ответы.

1 Ответ

0 голосов
/ 23 июня 2018

Оставьте только основной с replace вместо add:

fm.beginTransaction().replace(R.id.fragment_container, magFragment, "5").commit();

и удалите это из onCreate

fm.beginTransaction().add(R.id.fragment_container, ideaFragment, "4").commit();
fm.beginTransaction().add(R.id.fragment_container, videoFragment, "3").commit();
fm.beginTransaction().add(R.id.fragment_container, articleFragment, "2").commit();
fm.beginTransaction().add(R.id.fragment_container, mainListFragment, "1").commit();

затем во включенном onNavigationItemSelected выполните следующее:

switch (menuItem.getItemId()) {
    case R.id.nav_home:
        fm.beginTransaction().replace(R.id.fragment_container, magFragment, "5").commit();
        break;
    case R.id.nav_article:
        fm.beginTransaction().replace(R.id.fragment_container, articleFragment, "2").commit();
        break;
    case R.id.nav_video:
        fm.beginTransaction().replaceR.id.fragment_container, videoFragment, "3").commit();
        break;
    case R.id.nav_idea:
        fm.beginTransaction().replace(R.id.fragment_container, ideaFragment, "4").commit();
        break;
    case R.id.nav_mag:
        fm.beginTransaction().replace(R.id.fragment_container, mainListFragment, "1").commit();
        break;
}

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

fm.beginTransaction().replace(R.id.fragment_container, new MagPresenter((MagContract.View) magFragment, appRepository), "1").commit();
...