我的应用程序使用多个嵌套片段。其中一些片段是占位符。当我尝试用初始的片段替换占位符时,我得到了
java.lang.IllegalStateException: Activity has been destroyed
我确信活动很好,问题是由未附加到活动的碎片引起的。那么如何知道所有嵌套片段何时附加到活动?
有关我的设置的其他信息:
我有一个Activity
在其布局文件中有片段声明:
<LinearLayout
xmlns:android="http://schemas.android.com/apk/res/android"
android:id="@+id/mainLayout"
android:orientation="horizontal"
android:layout_width="match_parent"
android:layout_height="match_parent">
<fragment
android:id="@+id/rightPane"
android:layout_width="match_parent"
android:layout_height="match_parent"
class="com.company.PagerFragment"/>
</LinearLayout>
PagerFragment
是视图寻呼机的主机。
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="wrap_content"
android:layout_height="match_parent"
android:orientation="horizontal">
<ViewPager
android:id="@+id/pager"
android:layout_width="match_parent"
android:layout_height="match_parent"/>
</LinearLayout>
我将两个Fragment
放入寻呼机。它们作为占位符。
我想用初始片段替换占位符但是当我在activity onCreate
方法中启动替换时,我得到了上述异常。
如果我在活动的new Handler().postDelayed(..)
方法中使用onCreate
,那么一切正常。我宁愿不使用延迟方法,原因很明显。
我尝试用其他活动的方法替换占位符,例如onStart()
,onResume()
,onResumeFragments()
,onPostResume()
,但这没有帮助。
编辑:
public class PagerFragment extends Fragment
{
..
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState)
{
return inflater.inflate(R.layout.fragment_right_pane, container, false);
}
@Override
public void onViewCreated(View view, Bundle savedInstanceState)
{
super.onViewCreated(view, savedInstanceState);
if (savedInstanceState == null)
{
m_primary = new PlaceholderFragment();
m_secondary = new PlaceholderFragment();
}
else
{
FragmentManager fm = getChildFragmentManager();
m_primary = (PlaceholderFragment)fm.getFragment(savedInstanceState, FRAGMENT_TAG_PRIMARY);
m_secondary = (PlaceholderFragment)fm.getFragment(savedInstanceState, FRAGMENT_TAG_SECONDARY);
}
Fragment[] fragments = new Fragment[] { m_primary, m_secondary };
PagerAdapter pagerAdapter = new FragmentPagerAdapter(getChildFragmentManager(), fragments);
m_viewPager = (ViewPager)view.findViewById(R.id.pager);
m_viewPager.setAdapter(pagerAdapter);
m_viewPager.setOnPageChangeListener(this);
m_viewPager.setCurrentItem(0, true);
}
..
}