我可以从活动开始片段。然而,我担心我的实施可能出现的问题。从活动开始片段
我有两个片段,FragmentA
和FragmentB
我有3个活动课,Activity1
,Activity2
,ResultActivity
public class NavigationTabs extends FragmentActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.simple_tabs_2);
FragmentStatePagerAdapter adapter = new MyTabs(getSupportFragmentManager());
....
....
}
static class MyTabs extends FragmentStatePagerAdapter {
public MyTabs(FragmentManager fm) {
super(fm);
}
@Override
public Fragment getItem(int position) {
switch(position)
{
case 0:
FragmentA FragA = new FragmentA();
return FragA;
case 1:
FragmentB FragB = new FragmentB();
return FragB;
......
......
}
}
^我怎么叫通过意图FragmentA
和FragmentB
FragmentA
开始Activity1
。
Intent intent = new Intent(getActivity(), Activity1.class);
startActivity(intent);
Activity1
然后通过一个计数器的结果,以ResultActivity
ResultActivity
开始(或返回)FragmentA
和经由的onClick设置SharedPreferences像经由意图这个
public void onClick(View v) {
if(v.getId()== R.id.button_1){
SharedPreferences sp = PreferenceManager.getDefaultSharedPreferences(this);
Editor edit = sp.edit();
edit.putInt(passedSavePref, counter);
edit.commit();
finish();
}
}
FragmentB
开始Activity2
。
Intent intent = new Intent(getActivity(), Activity2.class);
startActivity(intent);
Activity2
然后通过一个计数器的结果ResultActivity
ResultActivity
开始(返回)FragmentB
,并通过设置的onClick像SharedPreferences这
public void onClick(View v) {
if(v.getId()== R.id.button_1){
SharedPreferences sp = PreferenceManager.getDefaultSharedPreferences(this);
Editor edit = sp.edit();
edit.putInt(passedSavePref, counter);
edit.commit();
finish();
}
}
这所有的作品我的需要。 GC似乎很好,它释放和分配内存。
ResultActivty
返回正确的Fragment,并正确设置SavedPreferences。
然而这似乎很不好实现。 对于初学者,同时通过我读过其他问题搜索,“不要直接从片段开始的活动”的海报也与这里的正确实施https://developer.android.com/guide/components/fragments.html#EventCallbacks
我已经打过电话Activity1
从FragmentA
这样,但我实在不明白行为上的差异或性能
Intent intent = new Intent(getActivity(), Activity1.class);
startActivity(intent);
getActivity().getSupportFragmentManager().popBackStack();
所以我的问题是,我需要完成/删除FragmentA
当我开始Activity1
,然后再从ResultActivity
使用类似
FragmentTransaction transaction = getFragmentManager().beginTransaction();
在此先感谢。
编辑因此,我试图是要么杀/面漆/流行FragmentA
,这样我可以从ResultActivity
重新启动它。 我之所以这样做的原因是因为当我从ResultActivity
回到FragmentA
时,我的savedPreferences没有加载。(好吧,他们正在保存和加载,但我看不到他们)
据我了解它的文档,片段继续暂停。所以调用我的loadPreferences方法onResume();加载我的SavedPreferences。
没有标记这个作为一个答案,因为我没有执行有关片段popBackStack();
的任何标准的/恰当的做法FragmentTransactions
等
这看起来太复杂了。当您尝试返回已经分离或删除的片段时,您可能会收到空指针异常... – StoneBird 2014-11-06 05:14:28
是的,你说得对。我的方法不必要的复杂性主要是由于不了解/理解片段的生命周期以及用于管理片段的工具。感谢您的反馈 – Mcorv 2014-11-06 13:57:36
您可以做的是使用您提到的回调模式,让主机活动处理所有操作,启动新的活动或片段。那么你的片段只是一个特定视图的容器。使用回调模式是首选,因为该活动具有所有'Context'的东西。 – StoneBird 2014-11-06 14:29:55