从android中的活动调用片段

Posted

技术标签:

【中文标题】从android中的活动调用片段【英文标题】:Call fragment from activity in android 【发布时间】:2014-09-01 23:32:14 【问题描述】:

我目前正在处理使用过的片段中的项目。但是在这里,当我从 Fragment 调用活动类时,它运行良好。我要做的是在 Back Pressed 上我需要调用一个 Fragment。但我不能,它显示错误并且我的应用程序停止。

所以我的问题是如何从活动中调用片段,以便我的序列应该是片段>活动>片段。

07-11 16:22:12.190: E/androidRuntime(11963): java.lang.IllegalStateException: 在 onSaveInstanceState 之后无法执行此操作

& 当我想从片段中调用活动时,它会给出错误

07-11 15:52:25.961: E/FragmentManager(11885): 没有为片段找到 id 0x7f05003c 的视图

那么,我怎样才能从活动中调用片段和从片段中调用活动?

【问题讨论】:

【参考方案1】:

尝试改变

transaction.commit();

transaction.commitAllowingStateLoss();

或者在你的activity中注释掉super onSaveInstance方法:

@Override
protected void onSaveInstanceState(Bundle outState) 
    //super.onSaveInstanceState(outState);

要从片段中调用活动,您可以使用:

((YourActivity)getActivity).someMethod();

【讨论】:

有几个原因可以避免这种情况,这里描述***.com/questions/17184653/…【参考方案2】:

java.lang.IllegalStateException: onSaveInstanceState 后无法执行此操作

解决方案:

添加或执行时使用transaction.commitAllowingStateLoss(); 导致异常的FragmentTransaction

 Why was the exception thrown?

抛出异常是因为您在保存 Activity 的状态后尝试提交 FragmentTransaction,导致称为 Activity 状态丢失的现象。

当你在调用onSaveInstanceState() 之后调用FragmentTransaction#commit() 时,事务将不会被记住,因为它从来没有被记录为活动状态的一部分。从用户的角度来看,事务会出现丢失,从而导致 UI 状态意外丢失。为了保护用户体验,Android 不惜一切代价避免状态丢失,只要发生就会简单地抛出一个IllegalStateException

注意:

使用commitAllowingStateLoss() 仅作为最后的手段。调用commit()commitAllowingStateLoss() 的唯一区别是,如果发生状态丢失,后者不会抛出异常。通常你不想使用这种方法,因为它暗示有可能发生状态丢失。当然,更好的解决方案是编写您的应用程序,以保证在保存活动状态之前调用 commit(),因为这将带来更好的用户体验。除非无法避免状态丢失的可能性,否则不应使用commitAllowingStateLoss()

更多来自:fragment-transaction-commit-state-loss。

FragmentManager(11885): 没有为片段找到 id 0x7f05003c 的视图

解决方案:

根据您在活动setContentView 的布局中设置的内容,片段管理器无法找到具有R.id.Container 的视图。

因此,无论您在 setContentView 中设置了什么布局,该布局都不包含具有解析为 id 0x7f05003c 的视图的视图,例如 R.id.Container

【讨论】:

以上是关于从android中的活动调用片段的主要内容,如果未能解决你的问题,请参考以下文章

android - 从活动调用完成会破坏托管片段吗?

Android:从片段调用时如何从活动中获取返回结果?

如何从Android中没有活动和片段的函数调用DialogFragment?

使后退按钮从活动返回到Android中的片段

如何将数据从一个活动传递到android中的另一个活动片段? [复制]

如何使用菜单按钮将数据从活动传递到android中的片段?