android - uso - Fragmentos anidados getchildfragmentmanager causando bloqueo
start fragment (2)
Tengo viewPager que contiene fragmentos cada uno de estos fragmentos tiene viewpager para mostrar imágenes y pancartas
ahora a cada fragmento Adaptador de imagen Estoy pasando getChildFragmentManager () como abajo
CarouselAdapter carouselAdapter = new CarouselAdapter(getChildFragmentManager());
Pero el código anterior causa un bloqueo al cambiar las pestañas de viewpager que muestran el siguiente mensaje
java.lang.IllegalArgumentException: No view found for id 0x7f1000ef
Pero si apruebo getFragmentManager () no se bloquea, pero el adaptador deja en blanco durante algún tiempo cualquier Idea sobre cómo manejar los fragmentos anidados.
Estoy usando FragmentPagerAdapter para ambos viewpagers pero aún no funciona
Lo siguiente es crashlog
java.lang.IllegalArgumentException: No view found for id 0x7f1000ef (com.packagename:id/viewPagerBanners) for fragment MainBannerFragmentNew{308cb84 #0 id=0x7f1000ef android:switcher:2131755247:0}
at android.support.v4.app.FragmentManagerImpl.moveToState(FragmentManager.java:1292)
at android.support.v4.app.FragmentManagerImpl.moveFragmentToExpectedState(FragmentManager.java:1523)
at android.support.v4.app.FragmentManagerImpl.moveToState(FragmentManager.java:1585)
at android.support.v4.app.FragmentManagerImpl.dispatchActivityCreated(FragmentManager.java:2832)
at android.support.v4.app.Fragment.performActivityCreated(Fragment.java:2199)
at android.support.v4.app.FragmentManagerImpl.moveToState(FragmentManager.java:1323)
at android.support.v4.app.FragmentManagerImpl.moveFragmentsToInvisible(FragmentManager.java:2323)
at android.support.v4.app.FragmentManagerImpl.executeOpsTogether(FragmentManager.java:2136)
at android.support.v4.app.FragmentManagerImpl.optimizeAndExecuteOps(FragmentManager.java:2092)
at android.support.v4.app.FragmentManagerImpl.execSingleAction(FragmentManager.java:1969)
at android.support.v4.app.BackStackRecord.commitNowAllowingStateLoss(BackStackRecord.java:620)
at android.support.v4.app.FragmentPagerAdapter.finishUpdate(FragmentPagerAdapter.java:143)
at android.support.v4.view.ViewPager.populate(ViewPager.java:1268)
at android.support.v4.view.ViewPager.populate(ViewPager.java:1116)
at android.support.v4.view.ViewPager$3.run(ViewPager.java:273)
at android.view.Choreographer$CallbackRecord.run(Choreographer.java:858)
at android.view.Choreographer.doCallbacks(Choreographer.java:670)
at android.view.Choreographer.doFrame(Choreographer.java:603)
at android.view.Choreographer$FrameDisplayEventReceiver.run(Choreographer.java:844)
at android.os.Handler.handleCallback(Handler.java:746)
at android.os.Handler.dispatchMessage(Handler.java:95)
at android.os.Looper.loop(Looper.java:148)
at android.app.ActivityThread.main(ActivityThread.java:5443)
at java.lang.reflect.Method.invoke(Native Method)
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:728)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:618)
A continuación se muestra el código del adaptador del carrusel
public class CarouselAdapter extends FragmentPagerAdapter {
private List<CarouselItem> carouselItemsList;
public CarouselAdapter(FragmentManager fm, List<CarouselItem> carouselItemsList) {
super(fm);
this.carouselItemsList = carouselItemsList;
}
@Override
public Fragment getItem(int position) {
return MainBannerFragmentNew.newInstance(R.drawable.gray_logo, carouselItemsList.get(position));
}
@Override
public int getCount() {
return carouselItemsList.size();
}
@Override
public void destroyItem(ViewGroup container, int position, Object object) {
super.destroyItem(container, position, object);
}
}
Lo que sigue es deslizar el código del adaptador de pestaña
public class HomeTabsPagerAdapter extends FragmentPagerAdapter {
ArrayList<HomeTabItem> homeTabItems;
public HomeTabsPagerAdapter(FragmentManager manager, ArrayList<HomeTabItem> homeTabItems) {
super(manager);
this.homeTabItems = homeTabItems;
}
@Override
public Fragment getItem(int position) {
HomeTabItem homeTabItem = homeTabItems.get(position);
return OfferZoneFragment.newInstance(homeTabItem.getId());
}
@Override
public int getCount() {
return homeTabItems.size();
}
@Override
public CharSequence getPageTitle(int position) {
return homeTabItems.get(position).getTitle();
}
}
Cada fragmento de pestaña deslizante tiene recyclerview esta vista de reciclaje contiene carrusel viewpager siguiente es el código en bindview
((BannerHolder) holder).viewPager.setAdapter(new CarouselAdapter(fragmentManager, homePageItems.get(position).carouselItems));
((BannerHolder) holder).circlePageIndicator.setViewPager(((BannerHolder) holder).viewPager);
final float density = context.getResources().getDisplayMetrics().density;
((BannerHolder) holder).circlePageIndicator.setBackgroundColor(0x00000000);
((BannerHolder) holder).circlePageIndicator.setRadius(5 * density);
((BannerHolder) holder).circlePageIndicator.setFillColor(ContextCompat.getColor(context, R.color.appthemecolor));
((BannerHolder) holder).circlePageIndicator.setPageColor(0xFFFFFFFF);
((BannerHolder) holder).circlePageIndicator.setStrokeColor(0x00000000);
((BannerHolder) holder).circlePageIndicator.setStrokeWidth(2 * density);
if (((BannerHolder) holder).viewPager.getAdapter().getCount() <= 1) {
((BannerHolder) holder).circlePageIndicator.setVisibility(View.GONE);
} else {
((BannerHolder) holder).circlePageIndicator.setVisibility(View.VISIBLE);
}
Reemplazó FragmentPagerAdapter por FragmentStatePagerAdapter para el problema resuelto de fragmento principal y secundario para mí.
Está utilizando getChildFragmentManager
para fragmentos anidados que es correcto.
Qué estás haciendo:
En su caso, cuando los fragmentos se desean adjuntar al viewpager (del niño), pero aquí el viewpager no está adjunto a su elemento principal (aún separado).
Lo que debes hacer:
Cree un ViewPager
personalizado anule su onAttachedToWindow
y haga el adaptador de conjunto perezoso.
Para obtener más detalles, eche un vistazo a IllegalArgumentException: no se ha encontrado ninguna vista para id for fragment - ViewPager en ViewPager .
Actualizar:
Si desea utilizar getFragmentManager
o getSupportFragmentManager
cambie la clase padre de su PagerAdapter
de android.support.v4.app.FragmentPagerAdapter
a android.support.v4.app.FragmentStatePagerAdapter
.