Перезагрузка фрагмента нижней панели

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

Основная деятельность

public class MainActivity extends AppCompatActivity {


@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);
    BottomNavigationView bottomNavigationView = (BottomNavigationView)
            findViewById(R.id.navigation);

    bottomNavigationView.setOnNavigationItemSelectedListener
            (new BottomNavigationView.OnNavigationItemSelectedListener() {
                @Override
                public boolean onNavigationItemSelected(@NonNull MenuItem item) {
                    Fragment selectedFragment = null;

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

                                selectedFragment = Tab1.newInstance();

                            break;
                        case R.id.action_item2:
                            selectedFragment = Tab2.newInstance();
                            break;
                        case R.id.action_item3:
                            selectedFragment = Tab3.newInstance();
                            break;
                    }
                    FragmentTransaction transaction = getSupportFragmentManager().beginTransaction();
                    transaction.replace(R.id.frame_layout, selectedFragment);
                    transaction.commit();
                    return true;
                }
            });

    //Manually displaying the first fragment - one time only
    FragmentTransaction transaction = getSupportFragmentManager().beginTransaction();
    transaction.replace(R.id.frame_layout, Tab1.newInstance());
    transaction.commit();

    //Used to select an item programmatically
    //bottomNavigationView.getMenu().getItem(2).setChecked(true);
}
}

Фрагмент

public class Tab1 extends Fragment {
ImageView imageview;
ProgressDialog progressDialog;
public static Tab1 newInstance() {
    Tab1 fragment = new Tab1();
    return fragment;
}

@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setRetainInstance(true);
}

@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
                         Bundle savedInstanceState) {
    View rootView =  inflater.inflate(R.layout.activity_tab1, container, false);

    imageview =(ImageView)  rootView.findViewById(R.id.immagine);
    FirebaseStorage storage = FirebaseStorage.getInstance();
    StorageReference storageRef = storage.getReferenceFromUrl("gs://test-x3b2c.appspot.com").child("lc.jpg");

    //download file as a byte array

    progressDialog = ProgressDialog.show(getActivity(), "Attendi",
            "Sto caricando il luogo comune", true);
    try {
        final File localFile = File.createTempFile("images", "jpg");
        storageRef.getFile(localFile).addOnSuccessListener(new OnSuccessListener<FileDownloadTask.TaskSnapshot>() {
            @Override
            public void onSuccess(FileDownloadTask.TaskSnapshot taskSnapshot) {
                Bitmap bitmap = BitmapFactory.decodeFile(localFile.getAbsolutePath());
                imageview.setImageBitmap(bitmap);
                progressDialog.dismiss();

            }
        }).addOnFailureListener(new OnFailureListener() {
            @Override
            public void onFailure(@NonNull Exception exception) {
            }
        });
    }
    catch (IOException e) {
    }
    return rootView;
}
}

person giorgio rota    schedule 29.06.2017    source источник
comment
да, вы можете установить тег для фрагмента, и когда вы вызываете следующий фрагмент, затем скройте текущий, как только вы вернетесь к предыдущему, затем найдите фрагмент по тегу и покажите предыдущий фрагмент   -  person Ganesh Gudghe    schedule 29.06.2017
comment
stackoverflow.com/questions/8432193/   -  person Ganesh Gudghe    schedule 29.06.2017
comment
replace приведет к перезапуску жизненного цикла фрагмента. Вы можете использовать комбинацию add, show и hide. См. мой ответ здесь для примера: stackoverflow.com/a/45595029/1102687   -  person Maxwell    schedule 09.08.2017


Ответы (1)


Измените свой код следующим образом:

    switch (item.getItemId()) {
                    case R.id.action_item1:
                        selectedFragment = Tab1.newInstance();
                        break;
                    case R.id.action_item2:
                        selectedFragment = Tab2.newInstance();
                        break;
                    case R.id.action_item3:
                        selectedFragment = Tab3.newInstance();
                        break;
                }

                if(selectedFragment ! =null) {
                 FragmentTransaction transaction = 
                      getSupportFragmentManager().beginTransaction();
                 transaction.replace(R.id.frame_layout, selectedFragment, selectedFragment.getTag());
                 transaction.commit();
                }

                return true;

    }

Тег Fragment позволяет избежать повторного создания фрагмента, если он уже существует.

person Ayush Khare    schedule 29.06.2017
comment
У меня такая же проблема с этим кодом... Я должен что-то добавить к фрагменту? - person giorgio rota; 29.06.2017
comment
Вам не нужно ничего добавлять к вашему фрагменту. Просто убедитесь, что каждый раз, когда вы заменяете фрагменты, вы добавляете transaction.replace(R.id.frame_layout, selectedFragment, selectedFragment.getTag()); selectedFragment.getTag() важен, если вы не хотите воссоздавать фрагмент - person Ayush Khare; 29.06.2017
comment
хорошо, но если я скопирую ваш код, он перезагрузит фрагмент, как и раньше... может быть, мне нужно что-то добавить на случай, если часть сломается? Спасибо - person giorgio rota; 29.06.2017
comment
Вам следует попробовать этот ответ, если вы хотите сохранять и восстанавливать состояния фрагментов. - person Ayush Khare; 29.06.2017
comment
getsupportfragmentmanger не работает в oncreate... по вашему мнению, есть другое решение? - person giorgio rota; 29.06.2017
comment
я не понимаю, что это за mContent в ссылке, которую вы мне присылаете - person giorgio rota; 29.06.2017
comment
Я не думаю, что вы читаете комментарии к этому ответу! mContent — это фрагмент, который вы хотите сохранить - person Ayush Khare; 29.06.2017
comment
извините, я их не видел... проблема в том, что менеджер getsupportfragment подчеркнут - person giorgio rota; 29.06.2017
comment
последняя проблема заключается в том, что он находит ошибку в mcontent... он говорит, что нашел android.support.v4.app. фрагмент, но он хочет Tab1 - person giorgio rota; 29.06.2017
comment
Вы должны использовать Fragment mContent, используйте Tab1 mContent - person Ayush Khare; 29.06.2017