gpt4 book ai didi

android - 从 Activity 开始 fragment

转载 作者:行者123 更新时间:2023-11-30 02:34:39 26 4
gpt4 key购买 nike

我能够从 Activity 中启动 fragment 。但是,我担心我的实现会出现潜在问题。

我有两个 fragment ,FragmentAFragmentB我有 3 个 Activity 类,Activity1Activity2ResultActivity

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;
......
......
}
}

^我如何调用FragmentAFragmentB

FragmentA 通过 intent 启动 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 通过 intent 启动 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。

然而,它的实现似乎很糟糕。对于初学者,在搜索我读过的其他问题时,“不要直接从 fragment 启动 Activity ”海报还链接到此处的正确实现 https://developer.android.com/guide/components/fragments.html#EventCallbacks

我试过像这样从 FragmentA 调用 Activity1,但我并没有真正看到行为或性能上的差异

  Intent intent = new Intent(getActivity(), Activity1.class);
startActivity(intent);
getActivity().getSupportFragmentManager().popBackStack();

所以我的问题是,当我启动 Activity1 时是否需要完成/删除 FragmentA,然后从 再次启动 FragmentA ResultActivity使用类似的东西

 FragmentTransaction transaction = getFragmentManager().beginTransaction();

提前致谢。

编辑 所以我试图做的是杀死/完成/弹出 FragmentA 以便我可以从 ResultActivity 重新启动它.我想这样做的原因是,当我从 ResultActivity 返回到 FragmentA 时,我的 savedPreferences 没有加载。(他们保存和加载正确,但我看不到他们)

据我从文档中了解到,Fragments 继续暂停。所以调用我的 loadPreferences 方法 onResume();加载了我的 SavedPreferences。

没有将此标记为答案,因为我没有实现任何处理 fragment 的标准/正确做法 popBackStack(); FragmentTransactions

最佳答案

  1. 引用:“不要直接从 fragment 启动 Activity ”

我读了写这篇文章的发帖者,我强烈反对。他的理由是它减少了 fragment 的模块化,他认为你应该插入一个接口(interface)来回调 Activity 。

我不同意。它不会减少模块化,实际上它会增加模块化。为什么要实现一个抽象层来做 fragment 在每个实现中打算做的事情?当可以在 fragment 中模块化时,为什么要在每个 Activity 中重新编写相同的代码?事实上,如果这违反设计原则, fragment 将不会有自己的专门功能来启动 Activity 。

例如,如果您使用 fragment.startAcitivtyForResult() 启动 Activity ,则该 fragment 将直接作为 onActivityResult 接收器。如果您使用 Activity 实例直接启动新 Activity ,则不是这样。

  1. 在开始一个新的 Activity 之前你不需要移除 fragments

Android 将暂停/停止您的 fragment ,并可能在需要时销毁它们和底层 Activity 。 Android 不断地破坏和重新创建 Activity 和 Fragment,就像每次您更改屏幕方向时一样 - 默认设置会让您的 Activity 和 Fragment 集体自杀。

这就是像 OnSaveInstanceState() 这样的函数如此重要的原因,因为它们可以让您的 Activity 和 fragment 返回到已保存的状态。 android 编程的一般规则是您的 Activity/fragment 应该能够优雅地响应自发死亡。

关于android - 从 Activity 开始 fragment ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26767789/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com