【问题标题】:open fragment from fragment?从片段打开片段?
【发布时间】:2013-11-04 19:29:30
【问题描述】:

我已经在其他类似问题上搜索过这个,但我无法解决它。我的问题是我无法从另一个片段中打开一个片段,我正在这样做:

FragmentLugaresLista frag = new FragmentLugaresLista();
Bundle args = new Bundle();
args.putString("gastronomyElementType", "Restaurants");
frag.setArguments(args);

ActivityContenedor asd = new ActivityContenedor();
asd.openFragment(frag);

方法openFragment变成ActivityContenedor:

public void openFragment(Fragment fragmentToOpen) {
    FragmentManager manager = getFragmentManager();
    manager.beginTransaction()
    .replace(R.id.content_frame, fragmentToOpen).commit();
    mDrawerLayout.closeDrawer(mDrawerList);
}

我遇到了这个错误:

11-04 16:23:38.731: E/AndroidRuntime(20705): FATAL EXCEPTION: main
11-04 16:23:38.731: E/AndroidRuntime(20705): java.lang.IllegalStateException: Activity     has been destroyed
11-04 16:23:38.731: E/AndroidRuntime(20705):    at android.app.FragmentManagerImpl.enqueueAction(FragmentManager.java:1299)
11-04 16:23:38.731: E/AndroidRuntime(20705):    at android.app.BackStackRecord.commitInternal(BackStackRecord.java:541)
11-04 16:23:38.731: E/AndroidRuntime(20705):    at android.app.BackStackRecord.commit(BackStackRecord.java:525)
11-04 16:23:38.731: E/AndroidRuntime(20705):    at com.example.despegarteproject.ActivityContenedor.openFragment(ActivityContenedor.java:113)
11-04 16:23:38.731: E/AndroidRuntime(20705):    at com.example.despegarteproject.FragmentLugares$GridViewListener.onItemClick(FragmentLugares.java:242)
11-04 16:23:38.731: E/AndroidRuntime(20705):    at android.widget.AdapterView.performItemClick(AdapterView.java:292)
11-04 16:23:38.731: E/AndroidRuntime(20705):    at android.widget.AbsListView.performItemClick(AbsListView.java:1068)
11-04 16:23:38.731: E/AndroidRuntime(20705):    at android.widget.AbsListView$PerformClick.run(AbsListView.java:2525)
11-04 16:23:38.731: E/AndroidRuntime(20705):    at android.widget.AbsListView$1.run(AbsListView.java:3186)
11-04 16:23:38.731: E/AndroidRuntime(20705):    at android.os.Handler.handleCallback(Handler.java:605)
11-04 16:23:38.731: E/AndroidRuntime(20705):    at android.os.Handler.dispatchMessage(Handler.java:92)
11-04 16:23:38.731: E/AndroidRuntime(20705):    at android.os.Looper.loop(Looper.java:137)
11-04 16:23:38.731: E/AndroidRuntime(20705):    at android.app.ActivityThread.main(ActivityThread.java:4448)
11-04 16:23:38.731: E/AndroidRuntime(20705):    at java.lang.reflect.Method.invokeNative(Native Method)
11-04 16:23:38.731: E/AndroidRuntime(20705):    at java.lang.reflect.Method.invoke(Method.java:511)
11-04 16:23:38.731: E/AndroidRuntime(20705):    at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:823)
11-04 16:23:38.731: E/AndroidRuntime(20705):    at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:590)
11-04 16:23:38.731: E/AndroidRuntime(20705):    at dalvik.system.NativeStart.main(Native Method)

你能帮帮我吗?我将不胜感激。

【问题讨论】:

  • 看起来您正在破坏父活动,但我没有您的完整代码。片段模仿其父活动的生命周期,因为如果父被销毁,所有子片段也将被销毁,从而导致此非法状态异常。你的 closeDrawer 方法发生了什么?

标签: android eclipse android-fragments exception fragment


【解决方案1】:

如果您的片段仅作为 ActivityContenedor 的子级存在,您可以这样做:

Activity parent = getActivity();
if (parent != null 
    && !parent.isFinishing() 
    && parent instanceof ActivityContenedor) {
    FragmentLugaresLista frag = new FragmentLugaresLista();
    Bundle args = new Bundle();
    args.putString("gastronomyElementType", "Restaurants");
    frag.setArguments(args);

    ((ActivityContenedor) parent).openFragment(frag);
}

而不是创建“新”活动(从不创建活动的正确方法)。

这将获取对该片段附加到的 Activity 的引用,将其转换为您的 ActivityContenedor 类,然后您就有了一个可以调用您的 openFragment 方法的有效实例。

【讨论】:

  • hmmmm 那也不是很好。你为什么要做一个新的(演员)父母?
  • 糟糕。复制/粘贴错误 ;)
  • 啊,现在我喜欢它了 :) 添加了额外的健全性检查,有时……某些版本的 android……会……允许你在 Activity 快要死并且你得到 IllegalStateException 时执行疯狂的事情。
【解决方案2】:

看起来您正在创建一个新活动并尝试在其上添加一个片段,但您只使用它的公共构造函数,而不是 Context 类中的任何“startActivity”方法。

此活动不是由系统创建的,也没有经过所有活动生命周期。我假设“destroyed”是创建活动的默认状态,当您尝试向它们添加片段时会检查此状态。

【讨论】:

    【解决方案3】:
    1. 您是否尝试启动一个 new 活动,其中包含 new 片段?

    2. 您是否尝试替换现有活动中的现有片段?

    3. 你想做什么? :)

    从不使用Activity a = new Activity();创建新活动

    话虽如此,从一个 Fragment 转到另一个 Fragment 的理想方法取决于您是否要更改活动……

    如果您可以更改它,那么只需通过 Intent 将一个值传递给活动,以便它可以在创建片段时启动它。

    如果您不想更改活动,只需执行 FragmentTransaction 来替换 Fragment。

    不要让事情变得复杂,他们不应该在这种情况下:)

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多