在Android上恢复FragmentActivity后,“java.lang.IllegalStateException:Activity已被破坏”

问题描述 投票:3回答:2

我正在使用这种方法:Separate Back Stack for each tab in Android using Fragments

我试图从第一个片段推送片段,在恢复FragmentActivity后这个动作导致“Activity已被破坏”错误。当推送片段第一次它工作正常,但当我暂停(最小化应用程序)FragmentActivity,重新打开它,然后尝试推送片段,它给出错误。我知道这个问题已被多次询问,但我无法从中得到任何解决方案。

错误

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;
    }
}

}
android android-fragments android-fragmentactivity
2个回答
0
投票

当你的Fragment完成并且导致了预期时,看起来你正在提交FragmentActivity

我建议在这种情况下创建机制来存储Fragment所需的信息,当你的FragmentActivity还活着并且没有完成时,然后执行Fragment的提交。


0
投票

除了写ft.commitAllowingStateLoss();你只需要写commit();,因为ft.commitAllowingStateLoss();定义了

It is similar to commit() but allows the commit to be executed after an activity's state is saved. This is dangerous because the commit can be lost if the activity needs to later be restored from its state, so this should only be used for cases where it is okay for the UI state to change unexpectedly on the user.

因此,如果你在此之前销毁了你的活动,它将始终抛出Activity has been destroyed错误。

© www.soinside.com 2019 - 2024. All rights reserved.