2014-06-06 9 views
0

Je suis nouveau sur Android et récemment j'utilise SlidingMenu (celui sur github) .Quand j'essaye de changer le fragment de MainActivity quand je clique sur le bouton sur le menu coulissant I obtenir l'erreur: "java.lang.IllegalStateException: l'activité a été détruite". Je pense que cela a quelque chose à voir avec les fragments mais ne peut pas comprendre comment faire face.java.lang.IllegalStateException: L'activité a été détruite SlidingFragmentActivity

Voici le journal

06-07 02:37:58.533: E/AndroidRuntime(31909): java.lang.IllegalStateException: Activity has been destroyed 
06-07 02:37:58.533: E/AndroidRuntime(31909): at android.app.FragmentManagerImpl.enqueueAction(FragmentManager.java:1295) 
06-07 02:37:58.533: E/AndroidRuntime(31909): at android.app.BackStackRecord.commitInternal(BackStackRecord.java:548) 
06-07 02:37:58.533: E/AndroidRuntime(31909): at android.app.BackStackRecord.commit(BackStackRecord.java:532) 
06-07 02:37:58.533: E/AndroidRuntime(31909): at com.example.ui.MainActivity.switchContent(MainActivity.java:67) 
06-07 02:37:58.533: E/AndroidRuntime(31909): at com.example.ui.SlidingMenuFragment.switchFragment(SlidingMenuFragment.java:110) 
06-07 02:37:58.533: E/AndroidRuntime(31909): at com.example.ui.SlidingMenuFragment.onClick(SlidingMenuFragment.java:100) 
06-07 02:37:58.533: E/AndroidRuntime(31909): at android.view.View.performClick(View.java:4171) 
06-07 02:37:58.533: E/AndroidRuntime(31909): at android.view.View$PerformClick.run(View.java:17097) 
06-07 02:37:58.533: E/AndroidRuntime(31909): at android.os.Handler.handleCallback(Handler.java:615) 
06-07 02:37:58.533: E/AndroidRuntime(31909): at android.os.Handler.dispatchMessage(Handler.java:92) 
06-07 02:37:58.533: E/AndroidRuntime(31909): at android.os.Looper.loop(Looper.java:137) 
06-07 02:37:58.533: E/AndroidRuntime(31909): at android.app.ActivityThread.main(ActivityThread.java:4803) 
06-07 02:37:58.533: E/AndroidRuntime(31909): at java.lang.reflect.Method.invokeNative(Native Method) 
06-07 02:37:58.533: E/AndroidRuntime(31909): at java.lang.reflect.Method.invoke(Method.java:511) 
06-07 02:37:58.533: E/AndroidRuntime(31909): at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:793) 
06-07 02:37:58.533: E/AndroidRuntime(31909): at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:560) 
06-07 02:37:58.533: E/AndroidRuntime(31909): at dalvik.system.NativeStart.main(Native Method) 

Voici les codes MainActivity

public class MainActivity extends SlidingFragmentActivity implements 
    OnClickListener { 
public static SlidingMenu slidingMenu = null; 
private Fragment mContent; 

private long exitTime = 0; 

@Override 
public void onCreate(Bundle savedInstanceState) { 
    // TODO Auto-generated method stub 
    super.onCreate(savedInstanceState); 
    initFragment(); 
    setContentView(R.layout.activity_main); 

    MyApplication.getInstance().addActivity(MainActivity.this); 
} 

private void initFragment() { 
    mContent = new RidingActivityFragment(); 
    // ridingActivityFragment = new RidingActivityFragment(); 
    getFragmentManager().beginTransaction() 
      .add(R.id.content_frame, mContent).commit(); 
    setBehindContentView(R.layout.sliding_menu); 
    FragmentTransaction fragmentTransaction = getFragmentManager() 
      .beginTransaction(); 
    Fragment aa = new SlidingMenuFragment(); 
    fragmentTransaction.replace(R.id.content_left, aa); 
    fragmentTransaction.commit(); 

    slidingMenu = getSlidingMenu(); 
    slidingMenu.setMode(SlidingMenu.LEFT); 
    slidingMenu.setBehindOffsetRes(R.dimen.sliding_menu_offset); 
    slidingMenu.setTouchModeAbove(SlidingMenu.TOUCHMODE_FULLSCREEN); 
} 

@Override 
public void onClick(View v) { 
    // TODO Auto-generated method stub 
    switch (v.getId()) { 
    case R.id.title_bar_imageview: 
     slidingMenu.toggle(true); 
     break; 

    default: 
     break; 
    } 
} 

public void switchContent(Fragment fragment) { 
    mContent = fragment; 
    getFragmentManager().beginTransaction() 
      .replace(R.id.content_frame, fragment).commit(); 
    getSlidingMenu().showContent(); 
} 

et SlidingMenuFragment

public class SlidingMenuFragment extends Fragment implements OnClickListener { 
private View logoutView = null; 
private View sycnView = null; 
private View ridingView = null; 

private MySharedpreference mySharedpreference = null; 

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

@Override 
public View onCreateView(LayoutInflater inflater, ViewGroup container, 
     Bundle savedInstanceState) { 
    // TODO Auto-generated method stub 
    View view = inflater.inflate(R.layout.fragment_sliding_menu, container, 
      false); 

    logoutView = view.findViewById(R.id.toolbox_logout); 
    logoutView.setOnClickListener(this); 
    sycnView = view.findViewById(R.id.toolbox_sycn); 
    sycnView.setOnClickListener(this); 
    ridingView = view.findViewById(R.id.toolbox_riding); 
    ridingView.setSelected(true); 
    ridingView.setOnClickListener(this); 

    return view; 
} 

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

@Override 
public void onClick(View v) { 
    // TODO Auto-generated method stub 
    Fragment newContent = null; 
    switch (v.getId()) { 
    case R.id.toolbox_sycn: 
     newContent = new SycnActivityFragment(); 
     sycnView.setSelected(true); 
     ridingView.setSelected(false); 
     break; 

    case R.id.toolbox_riding: 
     newContent = new RidingActivityFragment(); 
     ridingView.setSelected(true); 
     sycnView.setSelected(false); 
     break; 

    default: 
     break; 
    } 

    if (newContent != null) { 
     switchFragment(newContent); 
    } 
} 

private void switchFragment(Fragment fragment) { 
    if (getActivity() == null) { 
     return; 
    } 

    MainActivity mainActivity = new MainActivity(); 
    mainActivity.switchContent(fragment); 
} 

Merci à l'avance!

+0

Vous essayez de changer l'interface utilisateur après que l'activité était terminée. –

+0

Mais je ne sais pas où je destory l'activité ou qui peut conduire à la destory de l'activité – wamaker

+0

Que contiennent vos fragments? Y a-t-il un fragment qui contient directement ou indirectement un autre fragment? – rds

Répondre

0

Problème

Votre problème est ici: vous essayez de créer une autre instance que vous l'activité, dans votre fragment:

private void switchFragment(Fragment fragment) { 
if (getActivity() == null) { 
    return; 
} 

MainActivity mainActivity = new MainActivity(); 
    mainActivity.switchContent(fragment); 
} 

Solution

Au lieu de cela, vous devez getActivity à l'intérieur du fragment et écrire ce code dans SlidingMenuFragment:

private void switchFragment(Fragment fragment) { 
    if (getActivity() == null) { 
     return; 
    } 

    MainActivity mainActivity = (MainActivity)getActivity(); 
    mainActivity.switchContent(fragment); 
} 

Ce serait une bonne pratique si vous voulez utiliser les auditeurs de communiquer à votre activité de votre fragment

+0

Merci beaucoup !!! – wamaker

Questions connexes