- iOS/Objective-C 元类和类别
- objective-c - -1001 错误,当 NSURLSession 通过 httpproxy 和/etc/hosts
- java - 使用网络类获取 url 地址
- ios - 推送通知中不播放声音
正如您可能知道的那样,Android 也支持嵌套 fragment ,也通过 API 级别 17 的支持库。所以基本上我正在尝试将嵌套 fragment 添加到 ViewPager 的 fragment 之一中,并熟悉这个新的好功能。
在第一次启动应用程序时,一切都按预期工作,即我可以添加子 fragment 、浏览这些 fragment 、处理返回堆栈等。
但问题是,当我通过单击“后退”按钮离开应用程序并重新启动应用程序时,大多数时候我都会遇到以下异常,但并非总是如此:
java.lang.IllegalStateException: Activity has been destroyed
at android.support.v4.app.FragmentManagerImpl.enqueueAction(FragmentManager.java:1342)
at android.support.v4.app.BackStackRecord.commitInternal(BackStackRecord.java:595)
at android.support.v4.app.BackStackRecord.commit(BackStackRecord.java:574)
at com.cnlms.andnestedfragments.ui.fragments.FragWrapper.addChildFragment(FragWrapper.java:145)
at com.cnlms.andnestedfragments.ui.fragments.FragWrapper.onActivityCreated(FragWrapper.java:96)
at android.support.v4.app.Fragment.performActivityCreated(Fragment.java:1468)
at android.support.v4.app.FragmentManagerImpl.moveToState(FragmentManager.java:931)
at android.support.v4.app.FragmentManagerImpl.moveToState(FragmentManager.java:1088)
at android.support.v4.app.BackStackRecord.run(BackStackRecord.java:682)
at android.support.v4.app.FragmentManagerImpl.execPendingActions(FragmentManager.java:1444)
at android.support.v4.app.FragmentManagerImpl.executePendingTransactions(FragmentManager.java:461)
at android.support.v4.app.FragmentStatePagerAdapter.finishUpdate(FragmentStatePagerAdapter.java:163)
at android.support.v4.view.ViewPager.populate(ViewPager.java:1012)
at android.support.v4.view.ViewPager.populate(ViewPager.java:881)
at android.support.v4.view.ViewPager.onMeasure(ViewPager.java:1366)
at android.view.View.measure(View.java:15172)
at android.view.ViewGroup.measureChildWithMargins(ViewGroup.java:4814)
at android.widget.FrameLayout.onMeasure(FrameLayout.java:310)
at android.view.View.measure(View.java:15172)
at android.widget.LinearLayout.measureVertical(LinearLayout.java:833)
at android.widget.LinearLayout.onMeasure(LinearLayout.java:574)
at android.view.View.measure(View.java:15172)
at android.view.ViewGroup.measureChildWithMargins(ViewGroup.java:4814)
at android.widget.FrameLayout.onMeasure(FrameLayout.java:310)
at com.android.internal.policy.impl.PhoneWindow$DecorView.onMeasure(PhoneWindow.java:2148)
at android.view.View.measure(View.java:15172)
at android.view.ViewRootImpl.performMeasure(ViewRootImpl.java:1848)
at android.view.ViewRootImpl.measureHierarchy(ViewRootImpl.java:1100)
at android.view.ViewRootImpl.performTraversals(ViewRootImpl.java:1273)
at android.view.ViewRootImpl.doTraversal(ViewRootImpl.java:998)
at android.view.ViewRootImpl$TraversalRunnable.run(ViewRootImpl.java:4212)
at android.view.Choreographer$CallbackRecord.run(Choreographer.java:725)
at android.view.Choreographer.doCallbacks(Choreographer.java:555)
at android.view.Choreographer.doFrame(Choreographer.java:525)
at android.view.Choreographer$FrameDisplayEventReceiver.run(Choreographer.java:711)
at android.os.Handler.handleCallback(Handler.java:615)
at android.os.Handler.dispatchMessage(Handler.java:92)
at android.os.Looper.loop(Looper.java:137)
at android.app.ActivityThread.main(ActivityThread.java:4745)
at java.lang.reflect.Method.invokeNative(Native Method)
at java.lang.reflect.Method.invoke(Method.java:511)
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:786)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:553)
at dalvik.system.NativeStart.main(Native Method)
整个项目可用here .
Activity 是否可以在某个时候为空?我的意思是当我调用 getChildFragmentManager() 时, Activity 不应该附加到 fragment 管理器吗?任何建议将不胜感激。
有关该应用程序的更多详细信息,
ViewPager 托管两个 fragment 实例:FragRegular 和 FragWrapper。第一个只是一个简单的无用 fragment ;第二个,FragWrapper,充当父 fragment ,即子 fragment 的容器。 FragWrapper 的布局如下所示:
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout
xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical">
<!--
Adds nested child fragments when clicked
-->
<Button
android:id="@+id/btn_go_deep"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_alignParentBottom="true"
android:text="Go Nesty!"/>
<!--
Nested Fragment Container
-->
<FrameLayout
android:id="@+id/frag_container"
android:orientation="vertical"
android:layout_width="fill_parent"
android:layout_height="match_parent"
android:layout_above="@id/btn_go_deep"/>
</RelativeLayout>
所以基本上第一个子 fragment 是在 FragWrapper 的 onActivityCreated() 回调方法中添加到 FragWrapper 中的,随后的子 fragment 是在运行时添加的,通过单击按钮触发。 FragWrapper 类如下所示:
public final class FragWrapper extends BaseFragment {
/**
*
* The Wrapper Fragment that hosts nested child fragments.
*
* First child fragment is added in onActivityCreated() callback
*
* More child fragments can be added at runtime by clicking 'Go Nesty!'
* button.
*
*/
/**
* Holds back stacked fragment tags
*/
private Stack<String> backStack;
/**
* Child Fragment Manager
*/
private FragmentManager fm;
/**
* Fragment Tags
*/
private int fragCount = 1;
private static FragWrapper instance;
public static FragWrapper getInstance() {
if (instance == null) {
instance = new FragWrapper();
}
return instance;
}
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
View view = inflater.inflate(R.layout.frag_wrapper, container, false);
view.findViewById(R.id.btn_go_deep).setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
/**
* Adds nested child fragments
*/
fragCount+=1;
addChildFragment(
FragChild.newInstance(fragCount),
String.valueOf(fragCount),
true
);
}
});
return view;
}
@Override
public void onActivityCreated(Bundle savedInstanceState) {
super.onActivityCreated(savedInstanceState);
/**
* Add Initial Fragment
*/
addChildFragment(
FragChild.newInstance(fragCount),
String.valueOf(fragCount),
false
);
}
private void addChildFragment(final Fragment fragment, final String fragmentTag, final boolean addToBackStack) {
/**
* initialize child fragment manager
*/
if (fm == null) fm = getChildFragmentManager();
/**
* Starts a new transaction
*/
FragmentTransaction ft = fm.beginTransaction();
/**
* Hide lastly added fragment
*/
if (backStack != null && !backStack.isEmpty()) {
ft.hide(fm.findFragmentByTag(backStack.peek()));
}
/**
* Add new fragment
*/
ft.add(R.id.frag_container, fragment, fragmentTag );
/**
* Add to back stack
*/
if (addToBackStack) {
ft.addToBackStack(null);
}
/**
* Commit transaction
*/
ft.commit();
/**
* Save fragment tag
*/
if (backStack == null) backStack = new Stack<String>();
backStack.push(fragmentTag);
}
public boolean popFragment() {
/**
* Allow this fragment to consume the back button click
*/
if (backStack != null && !backStack.isEmpty()) {
backStack.pop();
fragCount-=1;
}
return fm != null && fm.popBackStackImmediate();
}
@Override
public boolean backPressed() {
return popFragment();
}
}
最佳答案
有人发布了另一个类似的问题,问题是由于 ChildFragmentManager 中的错误。基本上,当子 FragmentManager 从 Activity 中分离时,它最终会以损坏的内部状态结束。看看原来的答案here
关于Android 嵌套 fragment 问题 "java.lang.IllegalStateException: Activity has been destroyed",我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14321771/
我有两个类(class): parent 和 child child : belongs_to :parent 和 家长 has_many :children, :dependent => :dest
我有这个模型 class XmlImport ["text/xml"] end :event_import_records 条目正在被销毁。但是 :events 不是。 has_many throu
我定义了以下简单的管道: image: name: hashicorp/terraform:light entrypoint: - '/usr/bin/env' - 'PATH
我定义了以下简单的管道: image: name: hashicorp/terraform:light entrypoint: - '/usr/bin/env' - 'PATH
在我们的应用程序中,我们覆盖了 ActiveRecord destroy 方法,以便我们的记录不会被删除(因此用户可以取消删除)。像这样: def destroy self.is_deleted
我有一个笔记模型,具有以下关联 注意.rb has_many :note_categories, :dependent => :destroy has_many :categories, :throu
我是一名 Python 初学者。尝试制作一个新按钮来关闭窗口。我收到错误消息: Exception in Tkinter callback Traceback (most recent call la
我在我的应用程序中添加了评论功能,到目前为止一切正常,直到出现此错误。我所做的是添加了删除评论功能。当我启动服务器时一切正常,但在我单击“删除”按钮后问题出现了。 错误信息 undefined loc
Rails,def destroy,没有响应 destroy.js.erb 这是我的方法: # DELETE /Groups/1 # DELETE /Groups/1.xml def de
假设我有一个 MyClass 对象的集合 MyCollection。 Set MyCollection = Nothing 是否调用每个包含的对象的析构函数,或者我应该单独设置每个对象 = Nothi
我正在尝试使用 Node.js、Express 和 Mongodb 构建 REST API。我正在使用 mongodb npm 包连接到数据库,下面是我的 sever.js 文件代码 var expr
我有一个小问题,我有以下两个模型: class CriticalProcess :destroy has_many :roles, :through => :authorizations a
我正在使用 ng2-toastr 并收到以下错误 https://www.npmjs.com/package/ng2-toastr Attempt to use a destroyed view: d
基本信息: 系统: # cat /proc/version Linux version 3.10.0-514.2.2.el7.x86_64 (builder@kbuilder.dev.centos.o
一 点睛 destroy 用于销毁 ThreadGroup,该方法只是针对一个没有任何 active 线程的 group 进行一次 destroy 标记,调用该方法的直接结果是在父 group 中将自
我开始注意到 Scope::Guard 的一些奇怪之处。 . 如果我取消定义 $guard变量作为 sub 中的最后一个语句,守卫的 sub 得到 比我预期的要晚打电话。 如果我不取消它,或者如果我做
我正在构建一个提供打开和关闭它的服务的模式。该模式有一个控制关闭按钮的小 Controller ,以及进入模式内容的模板的 $compile。 那个模板就是一个组件,当然,那个组件有一个 Contro
一直在文件馆和网上寻找答案,但没有真正找到答案,只是零零碎碎。似乎有很多建议的帖子,但没有一个有答案。 我有一个使用范围的复杂指令:true。它实际上是我正在尝试为其编写清理代码的 ng-grid 最
给定以下 Delphi 代码,Foo 在 FormClose 上是 Free,但 TFoo.Destroy 是没有被调用 - 因此 Bar 没有被 Free'd,导致内存泄漏? 我是否在这里错过了一些
https://docs.angularjs.org/guide/directive By listening to this event, you can remove event listener
我是一名优秀的程序员,十分优秀!