我可以从一个活动开始一个片段。
但是我担心我的实施可能存在的问题。
我有两个片段,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尚未加载。(好了,它们可以正确地保存和加载,但是我看不到它们)据我从文档中了解到,片段继续暂停。因此,在onResume()上调用我的loadPreferences方法;加载了我的SavedPreferences。
不将其标记为答案,因为我没有实现处理片段
popBackStack();
FragmentTransactions
等的任何标准/正确实践 最佳答案
Quote:“不要直接从片段开始活动”
我读了写这篇文章的海报,但我对此表示强烈反对。他的理由是它减少了片段的模块化,并且他认为您应该推动一个接口来回调活动。
我不同意。它不会降低模块化,实际上会提高模块化。为什么要实现一个抽象层来执行每个实现中片段要执行的操作?如果可以在片段中对它们进行模块化,为什么还要在每个活动中都重写相同的代码?实际上,如果这违反了设计原则,则片段将没有自己的专用功能来启动活动。
例如,如果您使用fragment.startAcitivtyForResult()启动活动,则该片段将直接作为onActivityResult接收者放置。如果您使用活动实例直接启动新活动,则不是这样。
您无需在开始新的活动之前删除香精
Android会暂停/停止您的片段,并在需要时可能破坏它们以及基础活动。 Android会不断破坏和重新创建活动和片段,就像每次您更改屏幕方向时一样-默认设置会使您的活动和片段大量自杀。
这就是为什么诸如OnSaveInstanceState()之类的功能如此重要的原因,因为它们使您的活动和片段返回到保存状态。 android编程的一般规则是您的活动/片段应该能够优雅地响应自然死亡。
关于android - 从 Activity 开始 fragment ,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/26767789/