我可以从一个Activity开始一个Fragment。 但是我担心我的实施可能存在问题。
我有两个片段,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
返回正确的片段,并正确设置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
,然后使用类似
FragmentA
再次启动ResultActivity
FragmentTransaction transaction = getFragmentManager().beginTransaction();
提前致谢。
编辑所以我试图杀死/完成/弹出FragmentA
,以便我可以从ResultActivity
重新启动它。
我之所以这么做是因为当我从FragmentA
回到ResultActivity
时,我的savedPreferences没有加载。(他们正在保存并正确加载,但我看不到它们)
正如我从文档中理解的那样,碎片会暂停。所以调用我的loadPreferences方法onResume();加载了我的SavedPreferences。
不将此标记为答案,因为我没有实施任何处理碎片的标准/正确做法popBackStack();
FragmentTransactions
等
答案 0 :(得分:1)
我读过写这篇文章的海报,我强烈不同意。他的理由是它减少了片段的模块性,他认为你应该强迫一个接口回调活动。
我不同意。它并没有减少模块化,事实上它增加了它。为什么要实现一个抽象层来执行片段在每个实现中要做的事情?为什么在每个活动中重写相同的代码,何时可以在片段中进行模块化?事实上,如果这违反了设计原则,片段就没有自己的专门功能来开展活动。
例如,如果使用fragment.startAcitivtyForResult()启动活动,则片段将直接作为onActivityResult接收器放置。如果您使用活动实例直接启动新活动,则情况并非如此。
Android会暂停/停止你的碎片,如果需要,也可能会破坏它们和基础活动。 Android会不断地破坏和重新创建活动和片段,就像每次更改屏幕上的方向一样 - 默认设置会让您的活动和片段自杀。
这就是OnSaveInstanceState()之类的函数如此重要的原因,因为它们让您的活动和片段返回到已保存的状态。 android编程的一般规则是你的活动/片段应该能够优雅地响应自发死亡。