Почему контент исчезает после переключения между фрагментами в навигационной панели? - PullRequest
0 голосов
/ 09 марта 2019

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

Это

mainactivity.java

 public boolean onNavigationItemSelected(@NonNull MenuItem item) {

        switch (item.getItemId()){
            case R.id.nav_image:

                getSupportFragmentManager().beginTransaction().replace(R.id.fragment_container,
                        new ImagesFragment()).commit(); //this contains recycleview

                break;
            case R.id.nav_profile:
                getSupportFragmentManager().beginTransaction().replace(R.id.fragment_container,
                        new ProfileFragment()).commit();
                break;

        drawer.closeDrawer(GravityCompat.START);


        return true;
    }

ImagesFragment.java

       public View onCreateView(LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {
                View rootView =  inflater.inflate(R.layout.fragment_image,container,false);
     rv= (RecyclerView) rootView.findViewById(R.id.book_RV);

            //LAYOUT MANAGER
            rv.setLayoutManager(new LinearLayoutManager(getActivity()));
     GetImage();

    return rootView 

}
}

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

1 Ответ

0 голосов
/ 09 марта 2019

Каждый раз, когда вы создаете новый фрагмент вместо повторного использования старого.

Вы можете создавать фрагменты в виде полей в вашем классе:

ImagesFragment imagesFragment = new ImagesFragment();
ProfileFragment profileFragment = new ProfileFragment();

А внутри вашего switch вы можете использовать их повторно:

switch (item.getItemId()) {
    case R.id.nav_image:
        getSupportFragmentManager()
                .beginTransaction()
                .replace(R.id.fragment_container,
                        imagesFragment
                ).commit(); //this contains recycleview

        break;

    case R.id.nav_profile:
        getSupportFragmentManager()
                .beginTransaction()
                .replace(R.id.fragment_container,
                        profileFragment)
                .commit();
        break;
}

Вы можете разделить ваш метод на два:

  • первым делом выбираем фрагмент

  • второй метод выполняет транзакции.

Отображение выбранного фрагмента (и скрытие остальных):

public class MainActivity extends AppCompatActivity {

    // Create instance of the fragments
    ImagesFragment imagesFragment = new ImagesFragment();
    ProfileFragment profileFragment = new ProfileFragment();

    public boolean onNavigationItemSelected(@NonNull MenuItem item) {

        // Select fragment to show
        switch (item.getItemId()) {
            case R.id.nav_image:
                showFragment(imagesFragment);
                break;
            case R.id.nav_profile:
                showFragment(profileFragment);
                break;
        }

        drawer.closeDrawer(GravityCompat.START);
        return true;
    }

    void showFragment(Fragment fragmentToShow) {
        // Create transactionns
        FragmentTransaction transaction = getSupportFragmentManager()
                .beginTransaction()
                .setCustomAnimations(android.R.anim.slide_in_left, android.R.anim.slide_out_right);

        // Hide all of the fragments
        for (Fragment fragment : getSupportFragmentManager().getFragments()) {
            transaction.hide(fragment);
        }

        if (fragmentToShow.isAdded()) {
            // When fragment was previously added - show it
            transaction.show(fragmentToShow);
        } else {
            // When fragment is adding first time - add it
            transaction.add(R.id.fragment_container, fragmentToShow);
        }

        transaction.commit();
    }
}
...