0

我有一个Framelayout和BottomNavigationView的活动...我有4个片段(A,B,C,D)......事情是当我从A到B后,点击菜单项加载片段B,片段A被破坏......我在所有涉及Fragment生命周期和onDestroyView的回调方法(OnAttach,OnCreate,OnCreateView .....等)上添加了一条日志消息是当我改变片段总是叫......所以,当我回来之前打开的片段,onCreateView被再次打电话..片段被重新创建后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; 
    } 

} 

我想知道我在这里实际上错过了什么....在此先感谢

+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

您正在每次点击创建新实例。

如果您想用同一个替换或者添加到fragmentransaction的后台堆栈,请保留对这些引用的引用,但是您需要用于导航到前一个的标签。

相关问题