안드로이드에 중복 조각

심각한 :

내가 할 수있는이 방법을 구현하기로 결정 그래서 나는, 이전 내용을 잃지 않고 조각 사이를 전환하기 위해 노력하고있어 :

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();

}

추천

출처http://43.154.161.224:23101/article/api/json?id=283971&siteId=1