2014-10-14 4 views
0

두 개의 중첩 된 조각을 호스팅하는 조각을 호스팅하는보기 페이지가 있습니다. 그들은 잘 초기화하지만 화면을 회전하면 중첩 된 조각의 마지막 사라집니다 (Page2Fragment). 다시 회전하면 거기에 있습니다.오리엔테이션 변경시 조각이 사라짐

나는 그것이이 문제와 관련된 것 같아요 :

https://code.google.com/p/android/issues/detail?id=52112

하지만 그 문제는 해결 될 수 있다고하지만 나를 위해 작동하지 않습니다. 내 질문은 누군가가 이것에 대한 해결 방법이 있다면? 나는 아래 사용하는 코드를 게시 :

ViewPagerActivity :

package com.example.swekjaks.myapplication; 

import android.os.Bundle; 
import android.support.v4.app.Fragment; 
import android.support.v4.app.FragmentActivity; 
import android.support.v4.app.FragmentManager; 
import android.support.v4.app.FragmentStatePagerAdapter; 
import android.support.v4.view.PagerAdapter; 
import android.support.v4.view.ViewPager; 


public class ViewPagerActivity extends FragmentActivity { 

    /** 
    * The pager widget, which handles animation and allows swiping horizontally to access previous 
    * and next wizard steps. 
    */ 
    private ViewPager mPager; 

    /** 
    * The pager adapter, which provides the pages to the view pager widget. 
    */ 
    private PagerAdapter mPagerAdapter; 

    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.activity_view_pager); 

     // Instantiate a ViewPager and a PagerAdapter. 
     mPager = (ViewPager) findViewById(R.id.task_pager); 
     mPagerAdapter = new ScreenSlidePagerAdapter(getSupportFragmentManager()); 
     mPager.setAdapter(mPagerAdapter); 
    } 

    @Override 
    public void onBackPressed() { 
     if (mPager.getCurrentItem() == 0) { 
      // If the user is currently looking at the first step, allow the system to handle the 
      // Back button. This calls finish() on this activity and pops the back stack. 
      super.onBackPressed(); 
     } else { 
      // Otherwise, select the previous step. 
      mPager.setCurrentItem(mPager.getCurrentItem() - 1); 
     } 
    } 

    private class ScreenSlidePagerAdapter extends FragmentStatePagerAdapter { 
     public ScreenSlidePagerAdapter(FragmentManager fm) { 
      super(fm); 
     } 

     @Override 
     public Fragment getItem(int position) { 
      return new MainContainerFragment(); 
     } 

     @Override 
     public int getCount() { 
      return 1; 
     } 
    } 

} 

MainContainerFragment :

<?xml version="1.0" encoding="utf-8"?> 

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" 
    android:orientation="vertical" android:layout_width="match_parent" 
    android:layout_height="match_parent"> 
     <FrameLayout 
      android:orientation="vertical" 
      android:id="@+id/frameLayout_fragment1" 
      android:layout_width="match_parent" 
      android:layout_height="wrap_content"> 
     </FrameLayout> 

     <FrameLayout 
      android:orientation="vertical" 
      android:id="@+id/frameLayout_fragment2" 
      android:layout_width="match_parent" 
      android:layout_height="wrap_content"> 
     </FrameLayout> 

</LinearLayout> 

Page1Fragment :

FragmentMainContainer에 대한

package com.example.swekjaks.myapplication; 

import android.os.Bundle; 
import android.support.v4.app.Fragment; 
import android.support.v4.app.FragmentManager; 
import android.support.v4.app.FragmentTransaction; 
import android.view.LayoutInflater; 
import android.view.View; 
import android.view.ViewGroup; 

public class MainContainerFragment extends Fragment { 

    @Override 
    public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { 
     ViewGroup rootView = (ViewGroup) inflater.inflate(R.layout.fragment_main_container, container, false); 

     FragmentManager fragmentManager = getChildFragmentManager(); 
     AddFirstFragment(fragmentManager); 
     AddNextFragment(fragmentManager); 

     return rootView; 
    } 

    private void AddFirstFragment(FragmentManager fragmentManager) { 
     Page1Fragment fragment = (Page1Fragment) fragmentManager.findFragmentById(R.id.frameLayout_fragment1); 

     if (fragment == null) { 
      FragmentTransaction fragmentTransaction = fragmentManager.beginTransaction(); 
      Page1Fragment page1Fragment = new Page1Fragment(); 
      fragmentTransaction.add(R.id.frameLayout_fragment1, page1Fragment); 
      fragmentTransaction.commit(); 

     } else { 
      FragmentTransaction fragmentTransaction = fragmentManager.beginTransaction(); 
      fragmentTransaction.replace(R.id.frameLayout_fragment1, fragment); 
      fragmentTransaction.commit(); 
     } 
    } 

    private void AddNextFragment(FragmentManager fragmentManager) { 
     Page2Fragment fragment = (Page2Fragment) fragmentManager.findFragmentById(R.id.frameLayout_fragment2); 

     if (fragment == null) { 
      FragmentTransaction fragmentTransaction = fragmentManager.beginTransaction(); 
      Page2Fragment page2Fragment = new Page2Fragment(); 
      fragmentTransaction.add(R.id.frameLayout_fragment2, page2Fragment); 
      fragmentTransaction.commit(); 

     } else { 
      FragmentTransaction fragmentTransaction = fragmentManager.beginTransaction(); 
      fragmentTransaction.replace(R.id.frameLayout_fragment2, fragment); 
      fragmentTransaction.commit(); 
     } 
    } 
} 

보기

는 Page2Fragment : 나는 다음 코드 조각을 추가하여 최종적으로이 문제를 해결

package com.example.swekjaks.myapplication; 

import android.os.Bundle; 
import android.support.v4.app.Fragment; 
import android.view.LayoutInflater; 
import android.view.View; 
import android.view.ViewGroup; 

public class Page2Fragment extends Fragment { 

    @Override 
    public View onCreateView(LayoutInflater inflater, ViewGroup container, 
          Bundle savedInstanceState) { 
     ViewGroup rootView = (ViewGroup) inflater.inflate(
       R.layout.fragment_page_2, container, false); 

     return rootView; 
    } 


} 

답변

3

: 그래서

@Override 
    public void onSaveInstanceState(Bundle outState) { 

     //Remove fragments: 
     FragmentManager fragmentManager = getChildFragmentManager(); 
     Page1Fragment fragment1 = (Page1Fragment) fragmentManager.findFragmentById(R.id.frameLayout_fragment1); 
     Page2Fragment fragment2 = (Page2Fragment) fragmentManager.findFragmentById(R.id.frameLayout_fragment2); 

     if (fragment1 != null){ 
      FragmentTransaction fragmentTransaction = fragmentManager.beginTransaction(); 
      fragmentTransaction.detach(fragment1); 
      fragmentTransaction.commit(); 
     } 

     if (fragment2 != null){ 
      FragmentTransaction fragmentTransaction = fragmentManager.beginTransaction(); 
      fragmentTransaction.detach(fragment2); 
      fragmentTransaction.commit(); 
     } 

     super.onSaveInstanceState(outState); 


    } 

을, 나는 조각을 분리하고 호출하는 대신 fragmentTransaction.replace (...) 나는

fragmentTransaction.attach(fragment); 

이 작동하는 것 같다 지금까지 내가 어떤 단점

01을 보지 못했다 전화