2013-12-20 4 views
0

Это приложение, которое имеет SlidingMenu и PagerSlidingTabStrip, основное действие содержит фреймплей, а скользящее меню должно заменить фрагменты в контейнере, когда я нажимаю на элементы списка. Эти фрагменты располагают другими фрагментами через FragmentStatePagerAdapter.Fatal Exception при ротации

Приложение запускается нормально, первый фрагмент загружается, и когда я нажимаю элементы списка в меню, остальные фрагменты также загружаются нормально, но когда я вращаюсь, я получаю фатальное исключение. Однако, когда я сначала загружаю приложение и вращаюсь, самый первый фрагмент хорош с вращением. Так должно быть, как я заменяю фрагменты в моем onItemClick. Может ли кто-нибудь дать мне какие-нибудь указания?

MainActivity.java

public class MainActivity extends SlidingFragmentActivity { 


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

    setContentView(R.layout.activity_main); 


    getSupportFragmentManager() 
    .beginTransaction() 
    .replace(R.id.mainContentFrame, new WorkOutsContainerFrag()) 
    .commit(); 

    setBehindContentView(R.layout.menu); 

    ActionBar actionBar = getActionBar(); 

     populate(); 

     SlidingMenu menu = getSlidingMenu(); 

     menu.setMode(SlidingMenu.LEFT); 
     menu.setShadowWidthRes(R.dimen.shadow_width); 
     menu.setShadowDrawable(R.drawable.shadow); 
     menu.setBehindWidthRes(R.dimen.slidingmenu_offset); 
     menu.setFadeDegree(0.35f); 
     menu.setTouchModeAbove(SlidingMenu.TOUCHMODE_FULLSCREEN); 
     menu.setSlidingEnabled(false); 
     setSlidingActionBarEnabled(true); 

     actionBar.setDisplayHomeAsUpEnabled(true); 



    } 


    @Override 
    public boolean onOptionsItemSelected(MenuItem item) { 
     switch (item.getItemId()) { 
     case android.R.id.home: 
      toggle(); 
      return true; 
     default: 
      return super.onOptionsItemSelected(item); 
     } 
    } 

    private void populate() { 

     ListView lv = (ListView) findViewById(R.id.listView1); 
     String[] values = new String[] { "Workouts", "Information", "Ladders"}; 
     ArrayAdapter<String> adapter = new ArrayAdapter<String>(this, 
       android.R.layout.simple_list_item_1, android.R.id.text1, values); 
     lv.setAdapter(adapter); 


     lv.setOnItemClickListener(new AdapterView.OnItemClickListener() { 
      @Override 
      public void onItemClick(AdapterView<?> parent, View view, 
            int position, long id) { 
       SlidingMenu menu = getSlidingMenu(); 
       WorkOutsContainerFrag workoutsContainerFrag = new WorkOutsContainerFrag(); 
       InformationContainerFrag informationContainerFrag = new InformationContainerFrag(); 
       LaddersContainer laddersContainer = new LaddersContainer(); 

       switch (position) { 
       case 0: 
        getSupportFragmentManager().beginTransaction() 
        .addToBackStack(null) 
        .replace(R.id.mainContentFrame, workoutsContainerFrag) 
        .commit(); 
        menu.toggle(); 
        break; 

       case 1: 
        getSupportFragmentManager().beginTransaction() 
        .addToBackStack(null) 
        .replace(R.id.mainContentFrame, informationContainerFrag) 
        .commit(); 
        menu.toggle(); 
        break; 

       case 2: 
        getSupportFragmentManager().beginTransaction() 
        .addToBackStack(null) 
        .replace(R.id.mainContentFrame, laddersContainer) 
        .commit(); 
        menu.toggle(); 
        break; 
       } 
      } 
     }); 





    } 

}

Logcat

12-20 17:05:42.354: E/AndroidRuntime(2977): FATAL EXCEPTION: main 
12-20 17:05:42.354: E/AndroidRuntime(2977): java.lang.RuntimeException: Unable to  start activity ComponentInfo{com.racepace.onewest/com.racepace.onewest.MainActivity}: java.lang.IllegalArgumentException: No view found for id 0x7f040056 (com.racepace.onewest:id/workoutspager) for fragment GymWorkoutsFragment{418b1e20 #1 id=0x7f040056} 
12-20 17:05:42.354: E/AndroidRuntime(2977):  at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2211) 
12-20 17:05:42.354: E/AndroidRuntime(2977):  at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2261) 
12-20 17:05:42.354: E/AndroidRuntime(2977):  at android.app.ActivityThread.handleRelaunchActivity(ActivityThread.java:3740) 
12-20 17:05:42.354: E/AndroidRuntime(2977):  at android.app.ActivityThread.access$700(ActivityThread.java:141) 
12-20 17:05:42.354: E/AndroidRuntime(2977):  at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1262) 
12-20 17:05:42.354: E/AndroidRuntime(2977):  at android.os.Handler.dispatchMessage(Handler.java:99) 
12-20 17:05:42.354: E/AndroidRuntime(2977):  at android.os.Looper.loop(Looper.java:137) 
12-20 17:05:42.354: E/AndroidRuntime(2977):  at android.app.ActivityThread.main(ActivityThread.java:5103) 
12-20 17:05:42.354: E/AndroidRuntime(2977):  at java.lang.reflect.Method.invokeNative(Native Method) 
12-20 17:05:42.354: E/AndroidRuntime(2977):  at java.lang.reflect.Method.invoke(Method.java:525) 
12-20 17:05:42.354: E/AndroidRuntime(2977):  at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:737) 
12-20 17:05:42.354: E/AndroidRuntime(2977):  at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:553) 
12-20 17:05:42.354: E/AndroidRuntime(2977):  at dalvik.system.NativeStart.main(Native Method) 
12-20 17:05:42.354: E/AndroidRuntime(2977): Caused by: java.lang.IllegalArgumentException: No view found for id 0x7f040056 (com.racepace.onewest:id/workoutspager) for fragment GymWorkoutsFragment{418b1e20 #1 id=0x7f040056} 
12-20 17:05:42.354: E/AndroidRuntime(2977):  at android.support.v4.app.FragmentManagerImpl.moveToState(FragmentManager.java:917) 
12-20 17:05:42.354: E/AndroidRuntime(2977):  at android.support.v4.app.FragmentManagerImpl.moveToState(FragmentManager.java:1102) 
12-20 17:05:42.354: E/AndroidRuntime(2977):  at android.support.v4.app.FragmentManagerImpl.moveToState(FragmentManager.java:1084) 
12-20 17:05:42.354: E/AndroidRuntime(2977):  at android.support.v4.app.FragmentManagerImpl.dispatchActivityCreated(FragmentManager.java:1875) 
12-20 17:05:42.354: E/AndroidRuntime(2977):  at android.support.v4.app.FragmentActivity.onStart(FragmentActivity.java:547) 
12-20 17:05:42.354: E/AndroidRuntime(2977):  at android.app.Instrumentation.callActivityOnStart(Instrumentation.java:1171) 
12-20 17:05:42.354: E/AndroidRuntime(2977):  at android.app.Activity.performStart(Activity.java:5143) 
12-20 17:05:42.354: E/AndroidRuntime(2977):  at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2184) 
12-20 17:05:42.354: E/AndroidRuntime(2977):  ... 12 more 

ответ

0

Попробуйте вызвать Fragment.setRetainInstanceState (истинный) на все ваши фрагменты после того, как вы их экземпляры, как так :

Другое дело, что вам не нужно выполнять транзакцию фрагментов, которая у вас есть в onCreate(), так как вы сразу вызываете populate() и заменяете ее другим фрагментом перед его отображением на экране.

Смежные вопросы