如何解决Android:片段交易-第一个片段不会隐藏
我想使用导航抽屉在几个片段之间切换。我有一个使用replace()
类的FragmentTransaction
方法的工作代码。但是,它每次都会重新创建片段,这在使用抽屉时会产生可见的滞后。 (除地图片段外,没有任何动作会导致片段onCreate()
的巨大滞后。)
要解决此问题,我决定在启动时创建片段,然后仅使用hide()
和show()
方法。哪种方法有效,但是初始片段是我在启动过程中动态设置的(没有硬编码的XML)始终在所选片段的后面可见。
相关代码:
public class MainActivity extends AppCompatActivity implements NavigationView.OnNavigationItemSelectedListener{
/* ... */
private FragmentManager fragmentManager = getSupportFragmentManager();
private Fragment calendarFragment = new CalendarFragment();
private Fragment mapFragment = new MapFragment();
private Fragment contactFragment = new ContactFragment();
private Fragment faqFragment = new FaqFragment();
private Fragment aboutFragment = new AboutFragment();
private Fragment visibleFragment = calendarFragment;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
fragmentManager = getSupportFragmentManager();
fragmentManager.beginTransaction().add(R.id.nav_host_fragment,calendarFragment).commit();
fragmentManager.beginTransaction().add(R.id.nav_host_fragment,mapFragment).hide(mapFragment).commit();
fragmentManager.beginTransaction().add(R.id.nav_host_fragment,contactFragment).hide(contactFragment).commit();
fragmentManager.beginTransaction().add(R.id.nav_host_fragment,faqFragment).hide(faqFragment).commit();
fragmentManager.beginTransaction().add(R.id.nav_host_fragment,aboutFragment).hide(aboutFragment).commit();
/* ... */
navigationView = findViewById(R.id.nav_view);
navigationView.getMenu().findItem(R.id.nav_calendar).setChecked(true);
navigationView.setNavigationItemSelectedListener(this);
/* ... */
}
@Override
public boolean onNavigationItemSelected(@NonNull MenuItem item) {
if (item.getItemId() == R.id.nav_calendar) {
fragmentManager.beginTransaction().hide(visibleFragment).show(calendarFragment).addToBackStack(null).commit();
visibleFragment = calendarFragment;
toolbar.setTitle(getResources().getString(R.string.menu_calendar));
}
else if (item.getItemId() == R.id.nav_map) {
fragmentManager.beginTransaction().hide(visibleFragment).show(mapFragment).addToBackStack(null).commit();
visibleFragment = mapFragment;
toolbar.setTitle(getResources().getString(R.string.menu_map));
}
else if (item.getItemId() == R.id.nav_contact) {
fragmentManager.beginTransaction().hide(visibleFragment).show(contactFragment).addToBackStack(null).commit();
visibleFragment = contactFragment;
toolbar.setTitle(getResources().getString(R.string.menu_contact));
}
else if (item.getItemId() == R.id.nav_faq) {
fragmentManager.beginTransaction().hide(visibleFragment).show(faqFragment).addToBackStack(null).commit();
visibleFragment = faqFragment;
toolbar.setTitle(getResources().getString(R.string.menu_faq));
}
else if (item.getItemId() == R.id.nav_about) {
fragmentManager.beginTransaction().hide(visibleFragment).show(aboutFragment).addToBackStack(null).commit();
visibleFragment = aboutFragment;
toolbar.setTitle(getResources().getString(R.string.menu_about));
}
drawerLayout.close();
return true;
}
}
Any idea how to fix this either with `show()` and `hide()`,or using `replace()` without a lag.
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。