android - 替换 fragment 的最佳方法

标签 android performance fragment

我对让单个 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/

相关文章:

android - 如何检测NFC芯片的类型

java - 代码完成 XML 在 Android Studio 上不起作用

Android - native 套接字在第一次尝试时不删除 3G sleep 模式

c++ - 插入后对 vector 进行排序与​​插入到集合中

php - Ajax 片段元标记 - Googlebot 未读取页面内容

java - 如何使 ExpandableListView 中的某些项目不可扩展

android - 从 apk 文件中提取应用程序图标

sql - 具有较小日期范围(结果集)的 PostgreSQL 查询比具有较大日期范围(结果)的查询慢

postgresql - PostgreSQL 中的 "buffer"有多大

android - fragment 被方向改变的第一个 fragment 取代