[android] ViewPager에서 탭을 사용할 때 “Java.lang.IllegalStateException 활동이 제거되었습니다”오류가 발생합니다.

탭 모드에서 ActionBarSherlock을 사용하는 애플리케이션이 있는데 5 개의 탭이 있고 각 탭의 내용은 조각을 사용하여 처리됩니다. 그러나 tab2의 경우 xml 파일에 조각 페이지가있는 ViewPager 요소가있는 조각이 있습니다. 처음 응용 프로그램을 시작할 때 응용 프로그램을 탭으로 전환 할 수 있지만 두 번째로 tab2를 누르면 위에서 언급 한 오류가 발생합니다. 주요 활동은 다음과 같습니다.

public class MainActivity extends SherlockFragmentActivity
{
    @Override
    protected void onCreate(Bundle savedInstanceState)
    {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        ActionBar actionBar = getSupportActionBar();

        ActionBar.Tab tab1 = actionBar.newTab().setText("Tab1");
        ActionBar.Tab tab3 = actionBar.newTab().setText("Tab3");
        ActionBar.Tab tab2 = actionBar.newTab().setText("Tab2");
        ActionBar.Tab tab4 = actionBar.newTab().setText("Tab4");
        ActionBar.Tab tab5 = actionBar.newTab().setText("Tab5");

        Fragment fragment1 = new Tab1();
        Fragment fragment3 = new Tab3();
        Fragment fragment2 = new Tab2();
        Fragment fragment5 = new Tab5();
        Fragment fragment4 = new Tab4();

        tab1.setTabListener(new MyTabListener(fragment1));
        tab3.setTabListener(new MyTabListener(fragment3));
        tab2.setTabListener(new MyTabListener(fragment2));
        tab5.setTabListener(new MyTabListener(fragment5));
        tab4.setTabListener(new MyTabListener(fragment4));

        actionBar.addTab(tab1);
        actionBar.addTab(tab2);
        actionBar.addTab(tab3);
        actionBar.addTab(tab4);
        actionBar.addTab(tab5);

        actionBar.setNavigationMode(ActionBar.NAVIGATION_MODE_TABS);
    }

    class MyTabListener implements ActionBar.TabListener
    {
        Fragment fragment;

        public MyTabListener(Fragment fragment)
        {
            this.fragment = fragment;
        }

        @Override
        public void onTabSelected(com.actionbarsherlock.app.ActionBar.Tab tab,FragmentTransaction ft)
        {
            ft.replace(R.id.fragment_container,fragment);
        }

        @Override
        public void onTabUnselected(com.actionbarsherlock.app.ActionBar.Tab tab,FragmentTransaction ft)
        {

        }

        @Override
        public void onTabReselected(com.actionbarsherlock.app.ActionBar.Tab tab,FragmentTransaction ft)
        {

        }
    }
}

ViewPager가없는 조각 클래스는 다음과 같습니다.

public class Tab1 extends Fragment
{
    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container,Bundle savedInstanceState)
    {
        return inflater.inflate(R.layout.activity_tab1, container, false);
    }
}

ViewPager가있는 조각 클래스는 다음과 같습니다.

public class Tab2 extends Fragment
{
    ViewPager mViewPager;
    private MyFragmentPagerAdapter mMyFragmentPagerAdapter;
    private static int NUMBER_OF_PAGES = 5;

    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container,Bundle savedInstanceState)
    {
        View view =  inflater.inflate(R.layout.activity_tab2, container, false);
        return view;
    }

    @Override
    public void onViewCreated(View view,Bundle savedInstanceState)
    {
        super.onViewCreated(view, savedInstanceState);
        mViewPager = (ViewPager) view.findViewById(R.id.viewpager);
        mMyFragmentPagerAdapter = new MyFragmentPagerAdapter(getChildFragmentManager());
        mViewPager.setAdapter(mMyFragmentPagerAdapter);
    }

    private static class MyFragmentPagerAdapter extends FragmentPagerAdapter
    {
        public MyFragmentPagerAdapter(FragmentManager fm)
        {
             super(fm);
        }

        @Override
        public Fragment getItem(int index)
        {
             return PageFragment.newInstance("My Message " + index);
        }

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

내가 다른 곳에서 읽은 내용에서 (내가 틀렸다면 수정하십시오) 두 번째 패스의 조각 관리자가 더 이상 존재하지 않는 활동의 조각을 재사용하려고 시도하기 때문에 오류가 발생합니다. 그러나 나는 조각 활동을 사용하지 않기 때문에 왜 여기에서 일어나는지 잘 모르겠습니다. logcat에 따르면 오류는 Tab2 클래스, mViewPager.setAdapter (mMyFragmentPagerAdapter)라는 줄의 onViewCreated 메서드에 있습니다. 어떤 도움이라도 대단히 감사합니다 … 감사합니다.

03-04 12:01:05.468: E/AndroidRuntime(2474): FATAL EXCEPTION: main
03-04 12:01:05.468: E/AndroidRuntime(2474): java.lang.IllegalStateException: Activity has been destroyed
03-04 12:01:05.468: E/AndroidRuntime(2474):     at android.support.v4.app.FragmentManagerImpl.enqueueAction(FragmentManager.java:1342)
03-04 12:01:05.468: E/AndroidRuntime(2474):     at android.support.v4.app.BackStackRecord.commitInternal(BackStackRecord.java:595)
03-04 12:01:05.468: E/AndroidRuntime(2474):     at android.support.v4.app.BackStackRecord.commitAllowingStateLoss(BackStackRecord.java:578)
03-04 12:01:05.468: E/AndroidRuntime(2474):     at android.support.v4.app.FragmentPagerAdapter.finishUpdate(FragmentPagerAdapter.java:139)
03-04 12:01:05.468: E/AndroidRuntime(2474):     at android.support.v4.view.ViewPager.populate(ViewPager.java:1011)
03-04 12:01:05.468: E/AndroidRuntime(2474):     at android.support.v4.view.ViewPager.populate(ViewPager.java:880)
03-04 12:01:05.468: E/AndroidRuntime(2474):     at android.support.v4.view.ViewPager.setAdapter(ViewPager.java:433)
03-04 12:01:05.468: E/AndroidRuntime(2474):     at com.example.tabs.Tab2.onViewCreated(Tab2.java:31)
03-04 12:01:05.468: E/AndroidRuntime(2474):     at android.support.v4.app.FragmentManagerImpl.moveToState(FragmentManager.java:925)
03-04 12:01:05.468: E/AndroidRuntime(2474):     at android.support.v4.app.FragmentManagerImpl.moveToState(FragmentManager.java:1088)
03-04 12:01:05.468: E/AndroidRuntime(2474):     at android.support.v4.app.BackStackRecord.run(BackStackRecord.java:682)
03-04 12:01:05.468: E/AndroidRuntime(2474):     at android.support.v4.app.FragmentManagerImpl.execPendingActions(FragmentManager.java:1444)
03-04 12:01:05.468: E/AndroidRuntime(2474):     at android.support.v4.app.FragmentManagerImpl$1.run(FragmentManager.java:429)
03-04 12:01:05.468: E/AndroidRuntime(2474):     at android.os.Handler.handleCallback(Handler.java:587)
03-04 12:01:05.468: E/AndroidRuntime(2474):     at android.os.Handler.dispatchMessage(Handler.java:92)
03-04 12:01:05.468: E/AndroidRuntime(2474):     at android.os.Looper.loop(Looper.java:123)
03-04 12:01:05.468: E/AndroidRuntime(2474):     at android.app.ActivityThread.main(ActivityThread.java:3687)
03-04 12:01:05.468: E/AndroidRuntime(2474):     at java.lang.reflect.Method.invokeNative(Native Method)
03-04 12:01:05.468: E/AndroidRuntime(2474):     at java.lang.reflect.Method.invoke(Method.java:507)
03-04 12:01:05.468: E/AndroidRuntime(2474):     at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:842)
03-04 12:01:05.468: E/AndroidRuntime(2474):     at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:600)
03-04 12:01:05.468: E/AndroidRuntime(2474):     at dalvik.system.NativeStart.main(Native Method)



답변

이것은 중첩 된 조각에 대한 새로 추가 된 지원의 버그 인 것 같습니다. 기본적으로 자식 FragmentManager은 활동에서 분리 될 때 내부 상태가 깨집니다. 나를 위해 고친 단기 해결 방법은 호출 하는 onDetach()모든 항목에 다음을 추가 Fragment하는 것 getChildFragmentManager()입니다.

@Override
public void onDetach() {
    super.onDetach();

    try {
        Field childFragmentManager = Fragment.class.getDeclaredField("mChildFragmentManager");
        childFragmentManager.setAccessible(true);
        childFragmentManager.set(this, null);

    } catch (NoSuchFieldException e) {
        throw new RuntimeException(e);
    } catch (IllegalAccessException e) {
        throw new RuntimeException(e);
    }
}


답변

나는 똑같은 문제가 있습니다. 내가 찾은 유일한 해결 방법은 탭이 변경 될 때마다 조각을 새 인스턴스로 바꾸는 것입니다.

ft.replace(R.id.fragment_container, Fragment.instantiate(PlayerMainActivity.this, fragment.getClass().getName()));

실제 솔루션은 아니지만 이전 조각 인스턴스를 재사용하는 방법을 찾지 못했습니다.


답변

super.onCreate()내 메서드의 끝에서 호출 할 때 동일한 문제가 발생했습니다 . 이유 : attachActivity()FragmentActivity의 onCreate ()에서 호출됩니다. onCreate()예를 들어 탭을 재정의 하고 만들 때 탭 관리자는 활동이 FragmentManager에 연결되지 않은 상태에서 조각으로 전환을 시도합니다.

간단한 솔루션 : 호출을 super.onCreate()함수 본문의 헤드로 이동합니다 .

일반적으로이 문제가 발생할 수있는 많은 이유가있는 것 같습니다. 이것은 또 다른 하나입니다 …

마티아스


답변

내 문제가 FragmentTransaction내가 전화하기 전에 onCreate 를 만들려고 한 활동에 있다고 추가하고 싶었습니다 super.onCreate(). 나는 방금 super.onCreate()기능의 맨 위로 이동 했고 잘 작동했습니다.


답변

LocalBroadcastManager를 사용하고 있었기 때문에이 오류가 발생했습니다.

unregisterReceiver(intentReloadFragmentReceiver);

대신에:

LocalBroadcastManager.getInstance(this).unregisterReceiver(intentReloadFragmentReceiver);


답변

저도 같은 문제가 발생 lateron I가 전화를 놓친 것을 발견 super.onCreate( savedInstanceState );에서 onCreate()FragmentActivity의.


답변

FragmentManager조각이 완전히 초기화되기 전에 (즉, 활동에 연결되거나 적어도 onCreateView()호출 되기 전에) 자식에 액세스하려고 할 때 동일한 오류가 발생했습니다 . 그렇지 않으면 앞서 언급 한 예외를 발생시키는 활동으로 FragmentManager초기화됩니다 null.