我对让单个 Activity 在 fragment 之间切换的最佳方式很感兴趣。
例如,如果我使用此处显示的抽屉导航:http://developer.android.com/training/implementing-navigation/nav-drawer.html , 每次点击抽屉列表中的项目都被称为:
/** Swaps fragments in the main content view */
private void selectItem(int position) {
// Create a new fragment and specify the planet to show based on position
Fragment fragment = new PlanetFragment();
Bundle args = new Bundle();
args.putInt(PlanetFragment.ARG_PLANET_NUMBER, position);
fragment.setArguments(args);
// Insert the fragment by replacing any existing fragment
FragmentManager fragmentManager = getFragmentManager();
fragmentManager.beginTransaction()
.replace(R.id.content_frame, fragment)
.commit();
// Highlight the selected item, update the title, and close the drawer
mDrawerList.setItemChecked(position, true);
setTitle(mPlanetTitles[position]);
mDrawerLayout.closeDrawer(mDrawerList);
}
所以每次(即使用户转到之前显示的 fragment )都会创建一个新 fragment ,然后它会替换当前 fragment 。有没有更好的办法?例如重用 fragment 实例,或类似的东西?
最佳答案
是的,
您可以在 PlanetFragment 中创建一个公共(public)方法来设置位置并更新 UI。
private void selectItem(int position) {
PlanetFragment planet = (PlanetFragment) getFragmentManager().findFragmentById(R.id.content_frame);
if(planet != null) {
planet.setPosition(position);
}
}
但是,您的原始解决方案应该没问题。 fragment 事务很快,是时候实现更新 UI 的逻辑了。在大多数情况下,重新创建整个 fragment 会更容易,就像您这样做一样。
考虑这种方法,如果 Fragment 需要长时间初始化,这会导致进度条和延迟(在 UI 中)。这样您就可以避免重新启动,因此可以只更新状态(在本例中为位置)。
关于android - 替换 fragment 的最佳方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24913016/