0

Framelayout 및 BottomNavigationView에 대한 작업이 있습니다 ... 4 조각 (A, B, C, D)이 있습니다 ... A가 B로 프래그먼트 B를로드하기 위해 메뉴 항목을 클릭 한 후 프래그먼트 A가 파손됩니다 ... 모든 콜백 메소드 (OnAttach, OnCreate, OnCreateView ..... 등)에 대한 로그 메시지를 추가하여 프래그먼트 수명주기 및 onDestroyView와 관련된 로그 메시지를 추가했습니다.bottomnavigationview 변경 항목을 클릭하면 프래그먼트가 다시 생성됩니다.

public class Home extends AppCompatActivity 
{ 
    private BottomNavigationView.OnNavigationItemSelectedListener 
mOnNavigationItemSelectedListener 
     = new BottomNavigationView.OnNavigationItemSelectedListener() { 

    @Override 
    public boolean onNavigationItemSelected(@NonNull MenuItem item) 
    { 
     Fragment fragment = null; 
     Fragment currentFragment = getSupportFragmentManager().findFragmentById(R.id.fragment_container); 
     switch (item.getItemId()) 
     { 
      case R.id.navigation_a: 
       if (!(currentFragment instanceof FragmentA)) 
        fragment = FragmentA.newInstance(); 
       break; 
      case R.id.navigation_b: 
       if (!(currentFragment instanceof FragmentB)) 
        fragment = FragmentB.newInstance(); 
       break; 
      case R.id.navigation_c: 
       if (!(currentFragment instanceof FragmentC)) 
        fragment = FragmentC.newInstance(); 
       break; 
      case R.id.navigation_d: 
       if (!(currentFragment instanceof FragmentD)) 
        fragment = FragmentD.newInstance(); 
       break; 
     } 

     if (fragment != null) { 
      getSupportFragmentManager().beginTransaction().replace(R.id.fragment_container, fragment).commit(); 
      return true; 
     } 

     return false; 
    } 

}; 


//TODO Handle life-cycle methods when switching between fragments 
@Override 
protected void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.activity_home); 
    Toolbar toolbar = findViewById(R.id.toolbar); 
    setSupportActionBar(toolbar); 

    FragmentManager fm = getSupportFragmentManager(); 
    fm.beginTransaction() 
      .add(R.id.fragment_container, FragementA.newInstance()) 
      .commit(); 
    fm.popBackStack(); 

    BottomNavigationView navigation = findViewById(R.id.navigation);  navigation.setOnNavigationItemSelectedListener(mOnNavigationItemSelectedListener); 
} 

public boolean onKeyDown(int keyCode, KeyEvent event) 
{ 
    if (keyCode == KeyEvent.KEYCODE_BACK) 
    { 
     moveTaskToBack(true); 
     return true; 
     } 

    return false; 
    } 

} 

:

여기 내 활동 클래스의 .. 내가 조각을 변경할 때 항상 ...라고 그래서 나는 이전에 열었던 조각에 돌아올 때, onCreateView 다시 호출되는 여기에 실종 된 것이 무엇인지 알고 싶습니다 .... 사전에 감사드립니다.

+0

@Claude ... 알아 냈어? – GvSharma

+0

@GvSharma .... 나는 나의 늦은 응답 친구에게 정말로 유감스럽게 생각한다 !! ... 실제로 나는 내부의 viewpager를 사용했다. 나는 급한 것에서 아래 제안 된 아이디어를 시험 할 시간이 없었다. 그러나 백스트록에 조각을 추가하는 것이 확실히 문제를 해결한다고 생각합니다. –

답변

0

조각에 setRetainInstance(true);을 사용해보세요.

// this method is only called once for this fragment 
@Override 
public void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    // retain this fragment 
    setRetainInstance(true); 
} 
+0

예 ... 사실 저는 여기에 문제를 게시하기 전에 이미 시도했습니다 .... 트릭을 수행하지 않는 것 같습니다. –

1

잘 조각을 백 스택에 추가하지 마십시오.

1

클릭 할 때마다 새 인스턴스가 생성됩니다.

동일한 태그로 대체하려는 경우 해당 참조를 유지하거나 조각 트랜잭션의 백 스택에 추가하려면 이전 참조를 유지해야하지만 이전 태그를 탐색 할 때 태그가 필요합니다.