我有一个导航视图,其中包含一些项目,当按下一个项目时,它将转到该片段。例如,如果您按下" Home"项目,在抽屉上,它将调出主页片段。
navigationView = (NavigationView)findViewById(R.id.navigation_view);
navigationView.setNavigationItemSelectedListener(new NavigationView.OnNavigationItemSelectedListener() {
@Override
public boolean onNavigationItemSelected(MenuItem item) {
switch (item.getItemId()) {
case R.id.home_id:
HomeFragment homeFragment = (HomeFragment) fragmentManager.findFragmentByTag("Home");
if (homeFragment == null)
homeFragment = new HomeFragment();
fragmentTransaction = fragmentManager.beginTransaction();
fragmentTransaction.replace(R.id.Main, homeFragment, "Home");
fragmentTransaction.commit();
getSupportActionBar().setTitle("Home");
item.setChecked(true);
drawerLayout.closeDrawers();
break;
case R.id.chat_id:
ChatFragment chatFragment = (ChatFragment) fragmentManager.findFragmentByTag("Chat");
if (chatFragment == null)
chatFragment = new ChatFragment();
fragmentTransaction = fragmentManager.beginTransaction();
fragmentTransaction.replace(R.id.Main, chatFragment, "Chat");
fragmentTransaction.commit();
getSupportActionBar().setTitle("Chat");
item.setChecked(true);
drawerLayout.closeDrawers();
break;
}
}
}
所以我认为正在发生的是当我使用replace()
方法时,它正在破坏聊天片段。如果我有关于聊天片段的数据怎么办?我想确保在更改片段时数据不会消失。
在ChatFragment
类我已经使用了这种覆盖方法:
@Override
public void onSaveInstanceState(Bundle outState)
{
Log.d("CHATFRAG", "onSaveInstanceState: been called ");
super.onSaveInstanceState(outState);
outState.putString("textView",textView.getText().toString());
//Save the fragment's state here
}
现在,当我在应用程序中切换片段时,此方法不会被调用,这意味着片段正在被销毁。
是否有另一种方法可以将屏幕上的当前片段与所需片段交换(不破坏两者)? 我将有更多的片段(最多十个),是否有一个不需要重复代码的优化解决方案?
答案 0 :(得分:3)
您可以提前创建片段,例如在活动的onCreate()
方法中
private HomeFragment homeFragment;
private ChatFragment chatFragment;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.my_activity);
homeFragment = new HomeFragment();
chatFragment = new ChatFragment();
}
然后在导航代码中:
@Override
public boolean onNavigationItemSelected(MenuItem item) {
switch (item.getItemId()) {
case R.id.home_id:
if (homeFragment == null)
homeFragment = new HomeFragment();
fragmentTransaction = fragmentManager.beginTransaction();
fragmentTransaction.replace(R.id.Main, homeFragment, "Home");
fragmentTransaction.commit();
getSupportActionBar().setTitle("Home");
item.setChecked(true);
drawerLayout.closeDrawers();
break;
case R.id.chat_id:
if (chatFragment == null)
chatFragment = new ChatFragment();
fragmentTransaction = fragmentManager.beginTransaction();
fragmentTransaction.replace(R.id.Main, chatFragment, "Chat");
fragmentTransaction.commit();
getSupportActionBar().setTitle("Chat");
item.setChecked(true);
drawerLayout.closeDrawers();
break;
}
}
答案 1 :(得分:3)
你正在用其他替换片段,所以第一个将被解除。如果你不想破坏它,你需要add
而不是replace
fragmentTransaction.add(R.id.Main, homeFragment, "Home");
答案 2 :(得分:1)
虽然我认为Ravi Rupareliya的答案是最佳选择(使用.add
),但我会分享另一种我认为可行的方法。
您可以将两个FrameLayout
添加到彼此之上,.add
一个Fragment
两个,然后替换它们的可见性。