Android嵌套片段不工作
我试图在一个片段类中包装一个viewpager转换,该片段类本身派生自另一个片段类。每当我试图创建viewpager时,它都会显示以下错误Android嵌套片段不工作,android,android-fragments,android-viewpager,Android,Android Fragments,Android Viewpager,我试图在一个片段类中包装一个viewpager转换,该片段类本身派生自另一个片段类。每当我试图创建viewpager时,它都会显示以下错误 02-09 11:28:34.321: E/AndroidRuntime(8520): java.lang.RuntimeException: Unable to start activity ComponentInfo{com.gm.gakkmusic/com.gm.gakkmusic.MainActivity}: java.lang.IllegalSta
02-09 11:28:34.321: E/AndroidRuntime(8520): java.lang.RuntimeException: Unable to start activity ComponentInfo{com.gm.gakkmusic/com.gm.gakkmusic.MainActivity}: java.lang.IllegalStateException: Recursive entry to executePendingTransactions
02-09 11:28:34.321: E/AndroidRuntime(8520): at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2338)
02-09 11:28:34.321: E/AndroidRuntime(8520): at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2390)
在StackOverflow中搜索了一段时间后,我发现我必须使用getChildFragmentManager将子片段嵌套到其主片段中,但我对整个过程有点困惑。如果有人能找出这个问题并给出一个快速的解决方案,那就太好了
资料来源如下:
这是从MainActivity.class创建Fragment1的地方
@Override
public void onNavigationDrawerItemSelected(int position) {
FragmentManager fragmentManager = getSupportFragmentManager();
switch (position) {
case 0:
fragmentManager.beginTransaction()
.replace(R.id.container, new Fragment1())
.commit();
break;
}
}
Fragment1.class是父片段,其中创建了子viewpager转换
public class Fragment1 extends Fragment implements OnItemClickListener {
private Fragment contentFragment;
SliderFragment sliderFragment;
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
FragmentManager fragmentManager = getActivity().getSupportFragmentManager();
if (savedInstanceState != null) {
if (fragmentManager.findFragmentByTag(SliderFragment.ARG_ITEM_ID) != null) {
sliderFragment = (SliderFragment) fragmentManager
.findFragmentByTag(SliderFragment.ARG_ITEM_ID);
contentFragment = sliderFragment;
}
} else {
sliderFragment = new SliderFragment();
switchContent(sliderFragment, SliderFragment.ARG_ITEM_ID);
}
}
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) {
View content = inflater.inflate(R.layout.fragment1_layout, container,
false);
return content;
}
@Override
public void onSaveInstanceState(Bundle outState) {
if (contentFragment instanceof SliderFragment) {
outState.putString("content", SliderFragment.ARG_ITEM_ID);
}
super.onSaveInstanceState(outState);
}
public void switchContent(Fragment fragment, String tag) {
FragmentManager fragmentManager = getActivity().getSupportFragmentManager();
while (fragmentManager.popBackStackImmediate())
;
if (fragment != null) {
FragmentTransaction transaction = fragmentManager
.beginTransaction();
transaction.replace(R.id.content_frame, fragment, tag);
if (!(fragment instanceof SliderFragment)) {
transaction.addToBackStack(tag);
}
transaction.commit();
contentFragment = fragment;
}
}
public void onBackPressed() {
FragmentManager fm = getActivity().getSupportFragmentManager();
if (fm.getBackStackEntryCount() > 0) {
super.getActivity().onBackPressed();
} else if (contentFragment instanceof SliderFragment
|| fm.getBackStackEntryCount() == 0) {
getActivity().finish();
}
}
public void onItemClick(AdapterView<?> parent, View view, int position,
long id) {
Log.i(LOG_TAG, "onItemClick: " + position);
Log.d(LOG_TAG, "checked items: " + listView.getCheckedItemCount());
Log.d(LOG_TAG,
"checked positions: " + listView.getCheckedItemPositions());
}
}
更新:我已经通过将所有getSupportFragmentManager替换为getChildFragmentManager解决了这个问题,但我仍然在寻找一种有效的方法来解决这个问题 参见@FlamePrincessϡ谢谢,已经解决了问题,但现在正在寻找有效的方法。