从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中没有活动和片段的函数调用DialogFragment?