我正在使用一个活动所有片段方法。现在我有一个片段A,当我转到片段B时,我用B替换容器中的A
.replace(R.id.master_fragment_container_above_toolbar, fragment)
.addToBackStack("")
.commit();
如您所见,我已将片段添加到backStack。但现在当我按下设备时,它会重新实例化片段A,因此需要时间才能返回。
还有其他办法吗?我不想使用add()
,如果我将多个片段添加到容器中,它将占用大量内存。
答案 0 :(得分:1)
简短的回答 - 你的案子里没有银弹。您必须使用replace()
,并且会在返回时重新创建片段View
。那是"设计"。
好消息是,您可以采取一些措施来降低用户体验的吸引力。
尽可能缓存。如果从Web加载内容 - 将其写入本地SQLite数据库。从服务器刷新数据时,从本地存储中填充屏幕。
在onCreateView()
中,避免在适配器存在后重新创建。如果用户从FragmentB返回FragmentA,FragmentA将重新创建其View
。但这并不意味着,此时局部变量为空。所以我这样做:
public class FeedFragment extends Fragment {
private FeedAdapter adapter;
......
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
View rootView = initialize(inflater, container, R.layout.fragment_with_recyclerview);
....
if (adapter == null) {
adapter = new FeedAdapter();
}
RecyclerView recyclerView = (RecyclerView)rootView.findViewById(R.id.recyclerView)
recyclerView.setAdapter(adapter);
recyclerView.setLayoutManager(new StaggeredGridLayoutManager(2, StaggeredGridLayoutManager.VERTICAL));
return rootView;
}
}
这很重要,因为填充TextView
等等是如此快速的操作,你并不真正关心它,而巨大的ListView
或RecyclerView
可能很多更贵;
使用图像缓存和良好的图像加载工具。我推荐Square的Picasso。它具有自动内存和磁盘缓存功能;
尝试在逻辑上解耦您的应用。我们来看一个Gmail风格的应用程序,例如:
它有NavigationDrawer
,它通过根片段切换用户(即不需要保留导航堆栈)。一旦打开mail-thread,它就会用MailThread片段替换根片段。在那里你可以使用内容。
但是一旦你点击"撰写电子邮件" - 当您从消费内容转移到撰写内容状态(即用户行为的重大变化:新用户场景==新活动)时,您将重定向到单独的Activity
许多顶级开发人员更进一步,几乎所有事情都有活动。推特(以及它的卫星产品)就是一个例子。但就个人而言,我更愿意保持平衡(因为从开场的角度来看,开展新活动是一项昂贵的操作)。