2014-02-05 57 views
3

我使用这种方法后:Separate Back Stack for each tab in Android using Fragments“java.lang.IllegalStateException:活动遭到破坏”恢复FragmentActivity在Android

我想从第一片段推片段,恢复FragmentActivity此操作导致后“活动已被摧毁”的错误。当第一次推片段时它工作正常,但当我暂停(最小化应用程序)该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; 
    } 
} 

} 
+0

您的mActivity指针是否得到正确更新? – Niko

+0

'mActivity'get正常更新。但是'commit()'推送片段的问题。 –

+0

你应该检查你的mA活动是否存在。你能提供你的毫安宣言吗? – xxxzhi

回答

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错误。

相关问题