在Android上恢复FragmentActivity后,“java.lang.IllegalStateException:Activity has been destroyed”

3
我正在使用这种方法:在 Android 中使用 Fragments 为每个选项卡单独设置返回栈
我尝试从第一个 Fragment 推送 Fragment,但在恢复 FragmentActivity 后,此操作会导致“已销毁 Activity”错误。第一次推送 Fragment 时它可以正常工作,但是当我暂停(最小化应用)那个 FragmentActivity ,重新打开它然后再尝试推送 Fragment 时,它会出现错误。我知道这个问题已经被问了很多次,但我无法从中获得任何解决方案。 错误
02-05 11:51:01.889: E/AndroidRuntime(379): FATAL EXCEPTION: main
02-05 11:51:01.889: E/AndroidRuntime(379): java.lang.IllegalStateException: Activity has been destroyed
02-05 11:51:01.889: E/AndroidRuntime(379):     at android.support.v4.app.FragmentManagerImpl.enqueueAction(FragmentManager.java:1365)
02-05 11:51:01.889: E/AndroidRuntime(379):     at android.support.v4.app.BackStackRecord.commitInternal(BackStackRecord.java:595)
02-05 11:51:01.889: E/AndroidRuntime(379):     at android.support.v4.app.BackStackRecord.commitAllowingStateLoss(BackStackRecord.java:578)
02-05 11:51:01.889: E/AndroidRuntime(379):     at com.app.main.AppMainTabActivity.pushFragments(AppMainTabActivity.java:650)
02-05 11:51:01.889: E/AndroidRuntime(379):     at com.app.home.Home$ExpandableListAdapter$1.onClick(Home.java:530)
02-05 11:51:01.889: E/AndroidRuntime(379):     at android.view.View.performClick(View.java:2408)
02-05 11:51:01.889: E/AndroidRuntime(379):     at android.view.View$PerformClick.run(View.java:8816)
02-05 11:51:01.889: E/AndroidRuntime(379):     at android.os.Handler.handleCallback(Handler.java:587)
02-05 11:51:01.889: E/AndroidRuntime(379):     at android.os.Handler.dispatchMessage(Handler.java:92)
02-05 11:51:01.889: E/AndroidRuntime(379):     at android.os.Looper.loop(Looper.java:123)
02-05 11:51:01.889: E/AndroidRuntime(379):     at android.app.ActivityThread.main(ActivityThread.java:4627)
02-05 11:51:01.889: E/AndroidRuntime(379):     at java.lang.reflect.Method.invokeNative(Native Method)
02-05 11:51:01.889: E/AndroidRuntime(379):     at java.lang.reflect.Method.invoke(Method.java:521)
02-05 11:51:01.889: E/AndroidRuntime(379):     at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:868)
02-05 11:51:01.889: E/AndroidRuntime(379):     at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:626)
02-05 11:51:01.889: E/AndroidRuntime(379):     at dalvik.system.NativeStart.main(Native Method)

我在第一个片段中点击可展开的列表项,推出第二个片段。我在BaseExpandableListAdapter中显示错误。

AppMainFragmentActivity中的Push和Pop方法

public void pushFragments(String tag, Fragment fragment, boolean shouldAnimate, boolean shouldAdd) {
    if (shouldAdd) {
        mStacks.get(tag).push(fragment);
    }

    if (!isFinishing()) {
        FragmentManager manager = getSupportFragmentManager();
        FragmentTransaction ft = manager.beginTransaction();
        if (shouldAnimate)
            ft.setCustomAnimations(R.anim.slide_in_right, R.anim.slide_out_left);
        ft.replace(R.id.realtabcontent, fragment);
        ft.commit();
        }
    else {
        FragmentManager manager = getSupportFragmentManager();
        FragmentTransaction ft = manager.beginTransaction();
        if (shouldAnimate)
            ft.setCustomAnimations(R.anim.slide_in_right, R.anim.slide_out_left);
        ft.replace(R.id.realtabcontent, fragment);
        ft.addToBackStack(null);
        ft.commitAllowingStateLoss();//error shows here also.
    }
}

public void popFragments() {
    /*if (!isFinishing()) { }*/
    Fragment fragment = mStacks.get(mCurrentTab).elementAt(mStacks.get(mCurrentTab).size() - 2);
    /*pop current fragment from stack.. */
    mStacks.get(mCurrentTab).pop();

    FragmentManager manager = getSupportFragmentManager();
    FragmentTransaction ft = manager.beginTransaction();
    ft.setCustomAnimations(R.anim.slide_in_left, R.anim.slide_out_right);
    ft.replace(R.id.realtabcontent, fragment);
    ft.commit();
}

主页碎片

public class Firstfragment extends BaseFragment
{
@Override
public void onAttach(Activity activity) {
    super.onAttach(activity);
}

@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);

}

private void setupActionBar() {
    // TODO Auto-generated method stub

    actionBar = getSherlockActivity().getSupportActionBar();

    actionBar.setDisplayHomeAsUpEnabled(false);


    actionBar.setDisplayShowCustomEnabled(true);
    actionBar.setDisplayShowHomeEnabled(false);
    actionBar.setDisplayShowTitleEnabled(false);
    View cView = getSherlockActivity().getLayoutInflater().inflate(R.layout.actionbarbutton, null);
    final TextView cTitletext = (TextView) cView.findViewById(R.id.action_title_home);
    final ImageButton cSection_Menu = (ImageButton) cView.findViewById(R.id.imgbtn_1);

    actionBar.setCustomView(cView);
    cSection_Menu.setImageResource(R.drawable.section);
    cSection_Menu.setVisibility(View.VISIBLE);

    cTitletext.setVisibility(View.VISIBLE);
}

@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,    Bundle savedInstanceState) {
    View view = inflater.inflate(R.layout.home_newspaper_list, container,false);
    lv = (ExpandableListView) view.findViewById(R.id.newspapers_expandable);

    setHasOptionsMenu(true);
    return view;
}

@Override
public void onSaveInstanceState(Bundle outState) {
    super.onSaveInstanceState(outState);
    flag = true;
    outState.putBoolean("flag", flag);
}

@Override
public void onCreateOptionsMenu(Menu menu, MenuInflater inflater) {
    super.onCreateOptionsMenu(menu, inflater);
}

@Override
public void onPause() {
    super.onPause();
    flag = true;
    AppConstants.isFromHomeDetailView = false;
    index = lv.getFirstVisiblePosition();
}

@Override
public void onStop() {
    // TODO Auto-generated method stub
    super.onStop();
}

@Override
public void onResume() {
    super.onResume();
    lv.setSelectionFromTop(index, 0);

    System.out.println(" onResume Started > "+flag);
    setupActionBar();
}

@Override
public void onActivityCreated(Bundle savedInstanceState) {
    super.onActivityCreated(savedInstanceState);

    HashMap<String, ArrayList<HashMap<String,String>>> nlist = ma.newspaper_list;
    ArrayList<String> languagelist = ma.languagelist;

    expListAdapter = new ExpandableListAdapter(getActivity(), languagelist, nlist);

    lv.setAdapter(expListAdapter);
}

@Override
public boolean onOptionsItemSelected(MenuItem item) {
    return false;
}

public class ExpandableListAdapter extends BaseExpandableListAdapter
{

    /* methods for BaseExpandableListAdapterlike getchildcount() etc. */

    @Override
    public View getChildView(final int groupPosition, final int childPosition, boolean isLastChild, View convertView, ViewGroup parent) {
        View view = null;
        view.setOnClickListener(new OnClickListener() {
            @Override
            public void onClick(final View v) {
                secondfragment nl = new secondfragment ();
                mActivity.pushFragments(AppConstants.TAB_A,nl,true, true);//****error on that line after resuming activity**.**
            }
        });
        return view;
    }
}

}

你的mActivity指针是否得到了正确的更新? - Niko
mActivity得到了正确的更新,但在commit()推送片段时出现问题。 - Mayur Raval
你应该检查你的mActivity是否存活。你能提供你的mActivity声明吗? - xxxzhi
2个回答

0

看起来你正在提交Fragment,而此时你的FragmentActivity正在结束,这导致了异常。

我建议在这种情况下创建机制来存储Fragment所需的信息,并且当你的FragmentActivity处于活动状态且未结束时,再提交Fragment


0
除了写ft.commitAllowingStateLoss();之外,您只需要编写commit();,因为ft.commitAllowingStateLoss();定义为

它类似于commit(),但允许在保存活动状态后执行提交。这很危险,因为如果以后需要从其状态还原活动,则可能会丢失提交,因此只应用于UI状态可以意外更改用户的情况。

所以如果您先前销毁了活动,则始终会引发Activity has been destroyed错误。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接