심각한 :
내가 할 수있는이 방법을 구현하기로 결정 그래서 나는, 이전 내용을 잃지 않고 조각 사이를 전환하기 위해 노력하고있어 :
private void loadFragment(Fragment fragment) {
FragmentManager fragmentManager = getSupportFragmentManager();
fragmentManager.beginTransaction().hide(fragment);
if (!alreadyOpened[currentIndex]) {
alreadyOpened[currentIndex] = true;
fragmentManager.beginTransaction().add(R.id.fragment_container,fragment).commit();
} else {
fragmentManager.beginTransaction().show(fragment).commit();
}
}
그렇다면, 나는 그것을 보여 아니라 내가 그것을 추가하는 경우 : 조각이 이미 열려 있으면이 방법을 나는 확인한다. 그 때 나는 "alreadyOpened"로 선언합니다. 문제는 그 단편 전환 할 때 모든 세 단편 겹치는 것을 볼 수있다. 어떻게 그것을 해결할 수 있습니까? 이것은 내가 loadFragment 메소드를 호출 메뉴 모음입니다 :
private BottomNavigationView.OnNavigationItemSelectedListener mOnNavigationItemSelectedListener
= new BottomNavigationView.OnNavigationItemSelectedListener() {
@Override
public boolean onNavigationItemSelected(@NonNull MenuItem item) {
switch (item.getItemId()) {
case R.id.bbn_item1:
currentIndex = 0;
loadFragment(new HomeFragment());
return true;
case R.id.bbn_item2:
currentIndex = 1;
loadFragment(new PopularFragment());
return true;
case R.id.bbn_item3:
currentIndex = 2;
loadFragment(new PlayingFragment());
return true;
}
return false;
}
};
편집 : 새로운 코드
List<Fragment> fragments = new ArrayList<>();
private void loadFragment(Fragment fragment) {
FragmentTransaction ft = getSupportFragmentManager().beginTransaction();
if (alreadyOpened[currentIndex]) {
ft.replace(R.id.fragment_container, fragments.get(currentIndex));
} else {
fragments.add(currentIndex, fragment);
alreadyOpened[currentIndex] = true;
ft.replace(R.id.fragment_container, fragment);
}
ft.addToBackStack(null);
ft.commit();
}
OTO :
당신은 모든 탐색 클릭에 새로운 조각을 생성해서는 안된다. 어딘가에 한 번하고 저장 생성 된 List<Fragment> fragments
배열입니다. 그리고 사용 후 fragmentManager.beginTransaction().replace(R.id.fragment_layout, fragment);
여기에 작은 예입니다 :
FragmentTransaction ft = getSupportFragmentManager().beginTransaction();
ft.setCustomAnimations(R.anim.slide_in_left, R.anim.slide_out_left); //optional
ft.replace(R.id.fragment_layout, fragments.get(selectedFragment));
ft.addToBackStack(null);
ft.commit();
당신의에서 onNavigationItemSelected
전송 selectedFragment
변수와의 위치와 일치하는 fragments
목록을.
편집 :이 방법에 대해 :
public HomeFragment homeFragment;
public PopularFragment popularFragment;
public PlayingFragment playingFragment;
private BottomNavigationView.OnNavigationItemSelectedListener mOnNavigationItemSelectedListener
= new BottomNavigationView.OnNavigationItemSelectedListener() {
@Override
public boolean onNavigationItemSelected(@NonNull MenuItem item) {
switch (item.getItemId()) {
case R.id.bbn_item1:
if(homeFragment == null){ homeFragment =new HomeFragment();}
loadFragment(homeFragment )
return true;
case R.id.bbn_item2:
if(homeFragment == null){ popularFragment =new PopularFragment();}
loadFragment(popularFragment)
return true;
case R.id.bbn_item3:
if(homeFragment == null){ playingFragment =new PlayingFragment();}
loadFragment(playingFragment);
return true;
}
return false;
}
};
public void loadFragment(Fragment fragment){
FragmentTransaction ft = getSupportFragmentManager().beginTransaction();
ft.setCustomAnimations(R.anim.slide_in_left, R.anim.slide_out_left); //optional
ft.replace(R.id.fragment_layout, fragment);
ft.addToBackStack(null);
ft.commit();
}