10
다음

바닥 탐색보기 항목에 대한 내 코드 조각은

bottomNavigationView.setOnNavigationItemSelectedListener(new BottomNavigationView.OnNavigationItemSelectedListener() { 
@Override 
public boolean onNavigationItemSelected(@NonNull MenuItem item) { 
    Fragment fragment = null; 
    switch (item.getItemId()) { 
     case R.id.action_one: 
      // Switch to page one 
      fragment = FragmentA.newInstance(); 
      break; 
     case R.id.action_two: 
      // Switch to page two 
      fragment = FragmentB.newInstance(); 
      break; 
     case R.id.action_three: 
      // Switch to page three 
      fragment = FragmentC.newInstance(); 
      break; 
    } 
    getSupportFragmentManager().beginTransaction().replace(R.id.container,fragment,"TAG").commit(); 
    return true; 
} 
}); 

이제 내 문제는 때마다 조각이 재현되어있다

을 선택 단편을 다시 작성하지 않으려는 것입니다 선택 매번 addToBackStack (null)을 추가하려고 시도했지만,이 경우에는 뒤로 버튼 누름으로 인해 원하지 않는 스택에서 파편 조각이 계속 나타납니다.

시도 다시 만드는 조각

+0

는 것을 방지하기 위해, 나는지도를 만들 수 있습니다 '지도 '각 조각에 정적 ID가 있습니다. 나는'Activity'의'onCreate'에 모든 Fragment를 만듭니다. 하지만 추천하지 않습니다. 조각을'backstack'에'Fragment.class.getSimpleName()'과 같은 고유 태그로 추가 한 다음'findFragmentByTag'로 찾아서 다시 커밋 할 수 있습니다. '백 스택 (backstack) '에 한 번'각 조각 '을 추가해야합니다. –

+0

안녕하세요 라파엘입니다. 백 프레스 구현시 방해가되기 때문에 백 스택에 추가하고 싶지 않습니다. – apk

+0

이것을 위해'onBackPressed()'를 재정의 할 수 있습니다. 당신의'활동'에서. 주석'super.onBackPressed()' –

답변

6

없이 선택 하단 네비게이션 바의 조각을 표시 할 수있는 방법이 있나요이 : 당신의 container에 현재의 단편을 얻을 것이다

bottomNavigationView.setOnNavigationItemSelectedListener(new BottomNavigationView.OnNavigationItemSelectedListener() { 
       @Override 
       public boolean onNavigationItemSelected(@NonNull MenuItem item) { 
        Fragment fragment = null; 
        Fragment currentFragment = getSupportFragmentManager().findFragmentById(R.id.container); 
        switch (item.getItemId()) { 
         case R.id.action_one: 
          // Switch to page one 
          if (!(currentFragment instanceof FragmentA)) { 
           fragment = FragmentA.newInstance(); 
          } 
          break; 
         case R.id.action_two: 
          // Switch to page two 
          if (!(currentFragment instanceof FragmentB)) { 
           fragment = FragmentB.newInstance(); 
          } 
          break; 
         case R.id.action_three: 
          // Switch to page three 
          if (!(currentFragment instanceof FragmentC)) { 
           fragment = FragmentC.newInstance(); 
          } 
          break; 
        } 
        getSupportFragmentManager().beginTransaction().replace(R.id.container, fragment, "TAG").commit(); 
        return true; 
       } 
      }); 

다시 클릭하면 이 단편은 단편을 다시 추가하지 않습니다.

+0

다시 버튼을 클릭하면 홈 페이지로 리디렉션 될 수 있습니다 ... 제발 도와주세요. –

+0

'onBackPressed'기능을 '재정의'할 수 있습니다. 당신의 주요'활동'. –

+2

코드에서 첫 번째 FragmentA가로드 된 경우 두 번째 두 번째 조각이로드 된 후 클릭 한 후 firstFragment를 클릭하면 다시 작성됩니다. –

-1

setOnNavigationItemReselectedListener는 replace를 사용하는 경우이

FragmentTransaction fragmentTransaction = mFragmentManager.beginTransaction(); 
    Fragment fragment = mFragmentManager.findFragmentByTag(tag); 
    if (fragment == null) { 
     fragment = new YourFragment(); 
     fragmentTransaction.add(container.getId(), fragment, tag); 
    } else { 
     fragmentTransaction.attach(fragment); 
    } 

    Fragment curFrag = mFragmentManager.getPrimaryNavigationFragment(); 
    if (curFrag != null) { 
     fragmentTransaction.detach(curFrag); 
    } 

    fragmentTransaction.setPrimaryNavigationFragment(fragment); 
    fragmentTransaction.setReorderingAllowed(true); 
    fragmentTransaction.commitNowAllowingStateLoss(); 
9

을위한 더 나은 솔루션이 될 것입니다. 이미 메모리에있는 조각을 제공하더라도 replace은 조각의 수명주기를 다시 시작합니다. 재시작을 피하기 위해 트랜잭션 오브젝트의 메소드는 add, showhide을 포함하는데, 올바른 조각을 다시 시작하지 않고 표시하는 데 사용할 수 있습니다. 이 같은

private fun switchFragment(index: Int) { 
    val transaction = supportFragmentManager.beginTransaction() 
    val tag = fragments[index].tag 

    // if the fragment has not yet been added to the container, add it first 
    if (supportFragmentManager.findFragmentByTag(tag) == null) { 
     transaction.add(R.id.container, fragments[index], tag) 
    } 

    transaction.hide(fragments[navigationBar.currentTabPosition]) 
    transaction.show(fragments[index]) 
    transaction.commit() 
} 
+1

완전한 예제를 보시려면이 git repo https://github.com/okaybroda/FragmentStateManager를보십시오. – Viven

+0

상태/목록 위치 등을 유지하고자 할 때 세 목적지 사이의 탐색을 처리하는 가장 좋은 방법이라고 할 수 있습니까? 앞뒤로 움직이는가? 이 방법을 사용할 때주의해야 할 사항이 있습니까? 가능한 메모리 누수 또는 알아 둘 사항은 무엇입니까? 나는 아직 생명주기에 대해 100 % 소리가 나지 않습니다. – Burkely91

+0

이 작업을 수행하는 것이 더 좋을 지 또는 인스턴스 상태를 복원하는 것이 정말로 제가 생각하기를 원하는 것입니다! – Burkely91

2

조심 할 수있는 지원 라이브러리 V26와 그

+1

약간 혼란스러운 표현을 사용했습니다 : replace는 UI에 추가 될 때 프래그먼트의 수명주기를 다시 시작하지 않습니다. 현재 첨부 된 프래그먼트를 끝내고 이전에 파기 된 것으로 가정 할 수있는 새 프래그먼트를 추가합니다 제거되거나 처음 추가 될 경우. 그렇기 때문에 반드시 예 (Yes) 이상으로 시작할 것입니다. 왜냐하면 대체가 그것을 강제하기 때문입니다. 기본적으로 = remove (oldFrag)를 대체 한 다음 (newFrag)를 추가하십시오. – Burkely91

+0

'currentTabPosition'이란 무엇입니까? 'android.support.design.widget.BottomNavigationView'에는 해당 속성이없는 것으로 보입니다. –

1

사용 setOnNavigationItemReselectedListener :

private BottomNavigationView.OnNavigationItemReselectedListener onNavigationItemReselectedListener 
      = new BottomNavigationView.OnNavigationItemReselectedListener() { 

     @Override 
     public void onNavigationItemReselected(@NonNull MenuItem item) { 
      Toast.makeText(MainActivity.this, "Reselected", Toast.LENGTH_SHORT).show(); 
     } 
    }; 

및 사용하여 전화 :

navigation.setOnNavigationItemReselectedListener(onNavigationItemReselectedListener);