android - CoordinatorLayout replacing Fragments -


i have issue replacing fragments in coordinatorlayout container.

i have class coordinatorlayout appbarlayout , collapsingtoolbarlayout.

when activity starts, first fragment added show categories using recyclerview. if category selected, fragment replaced product fragment list of products, using recyclerview.

the issue when select category, second fragment appears empty, list not shown should.

if use listview instead of coordinatorlayout works fine.

and if use add in second fragment, both list appear overlapped.

any issue?

here xml activity:

<android.support.design.widget.coordinatorlayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.com/tools" xmlns:app="http://schemas.android.com/apk/res-auto" android:layout_width="match_parent" android:layout_height="match_parent" android:fitssystemwindows="true" android:id="@+id/container">   <android.support.design.widget.appbarlayout     android:id="@+id/appbarlayout"     android:layout_height="192dp"     android:layout_width="match_parent">     <android.support.design.widget.collapsingtoolbarlayout         android:id="@+id/ctllayout"         android:layout_width="match_parent"         android:layout_height="match_parent"         app:layout_scrollflags="scroll|exituntilcollapsed"         app:contentscrim="?attr/colorprimary"         app:layout_collapsemode="parallax">         <android.support.v7.widget.toolbar             android:id="@+id/appbar"             android:layout_height="?attr/actionbarsize"             android:layout_width="match_parent"             app:layout_scrollflags="scroll|enteralways"             app:layout_collapsemode="pin"/>     </android.support.design.widget.collapsingtoolbarlayout> </android.support.design.widget.appbarlayout> 

xml file fragments, containing rview:

<android.support.v7.widget.recyclerview     xmlns:android="http://schemas.android.com/apk/res/android"     xmlns:app="http://schemas.android.com/apk/res-auto"     android:id="@+id/cataloguerv"     android:layout_width="match_parent"     android:layout_height="match_parent"     app:layout_behavior="@string/appbar_scrolling_view_behavior" /> 

activity:

(....)   @override protected void oncreate(bundle savedinstancestate) {     super.oncreate(savedinstancestate);     setcontentview(r.layout.activity_coordinator);      //app bar     toolbar toolbar = (toolbar) findviewbyid(r.id.appbar);     setsupportactionbar(toolbar);      final actionbar ab = getsupportactionbar();     //cambiar por white para que sean iguales...     ab.sethomeasupindicator(r.drawable.ic_arrow_back_black);     ab.setdisplayhomeasupenabled(true);      //collapsingtoolbarlayout     ctllayout = (collapsingtoolbarlayout)findviewbyid(r.id.ctllayout);     ctllayout.settitle(getstring(r.string.categories));       //rellena la actividad con subcategoriasfragment     fragment fragmentsubcategorias = new subcategoriasfragment2();     fragmentmanager fragmentmanagermain = getsupportfragmentmanager();     fragmentmanagermain.begintransaction()             .add(r.id.container, fragmentsubcategorias).commit(); }  (...)  @override public void onsubcategoryselected(int idsubcategory) {     //argumentos para pasar al productosfragment     final bundle bundle = new bundle();     bundle.putint("idsubcategoria", idsubcategory);      fragment fragmentproductos = productosfragment2.newinstance(bundle);     fragmentmanager fragmentmanager = getsupportfragmentmanager();     fragmentmanager.begintransaction()             .add(r.id.container,                  fragmentproductos).addtobackstack(null).commit(); } 

fragment 1:

(....) public static subcategoriasfragment2 newinstance(bundle arguments){     subcategoriasfragment2 f = new subcategoriasfragment2();     if(arguments != null){         f.setarguments(arguments);     }     return f; }  public subcategoriasfragment2() {     // required empty public constructor }  @override public view oncreateview(layoutinflater inflater, viewgroup container, bundle savedinstancestate) {      view view = inflater.inflate(r.layout.activity_coordinator2, container, false);      int idcategoria=22;     //inicio el dao     this.msubcategoriasdao = new subcategoriasdao(view.getcontext());     //rellena la lista de subcategorias     mlistasubcategorias = msubcategoriasdao.getsubcategoriasdecategoria(idcategoria);      mrecycler = (recyclerview) view.findviewbyid(r.id.cataloguerv);     mrecycler.sethasfixedsize(true);     // usar un administrador para linearlayout     mlmanager = new linearlayoutmanager(view.getcontext());     mrecycler.setlayoutmanager(mlmanager);      //inicio el adapter de subcategorias     madapter = new subcategoriasadapter(mlistasubcategorias);     mrecycler.setadapter(madapter);      //maneja los eventos de click     clickhandle();      return view; }  public void clickhandle(){     /**      * manejo de clicks.      * gesturedetector.      * devuelve true si hay un click sencillo.      */     final gesturedetector subcategoriasgesturedetector = new gesturedetector(getactivity(),             new gesturedetector.simpleongesturelistener(){                 @override                 public boolean onsingletapup(motionevent e) {                     return true;                 }             });      /**      * define addonitemtl del rv al que se le pasa el objeto onitemtouchlistener      * cuando se crea un objeto onitemtocuhlistener, se sobrescriben dos métodos:      * onintercepttouchevent() le dice el tipo de gesto que ha detectado      */     mrecycler.addonitemtouchlistener(new recyclerview.onitemtouchlistener() {         /**          * onintercepttouchevent() detecta el evento          * @param recyclerview          * @param motionevent          * @return          */         @override         public boolean onintercepttouchevent(recyclerview recyclerview, motionevent motionevent) {              view child = recyclerview.findchildviewunder(motionevent.getx(),motionevent.gety());              if(child!=null && subcategoriasgesturedetector.ontouchevent(motionevent)){                 int position = mrecycler.getchildadapterposition(child);                 //obtiene el id de la subcategoría                 int idsubcategoria = mlistasubcategorias.get(position).getscid();                  mlistener.onsubcategoryselected(idsubcategoria);                  //actualiza nombre de la ventana                 getactivity().settitle(mlistasubcategorias.get(position).getscnombre());                  return true;             }             return false;         }         @override         public void ontouchevent(recyclerview recyclerview, motionevent motionevent) {             /**              * on touch event              */         }          @override         public void onrequestdisallowintercepttouchevent(boolean disallowintercept) {          }     });  }    @override public void onattach(activity activity) {     super.onattach(activity);     log.e("subcategorias2fragment", "onattach()");     try {         mlistener = (onsubcategoryselectedlistener) activity;     } catch (classcastexception e) {         throw new classcastexception(activity.tostring() + " must implement onsubcategoryselectedlistener");     } } 

fragment 2:

 (...)  public static productosfragment2 newinstance(bundle arguments){     productosfragment2 f = new productosfragment2();     if(arguments != null){         f.setarguments(arguments);     }     return f; }  public productosfragment2() {     // required empty public constructor }   @override public view oncreateview(layoutinflater inflater, viewgroup container, bundle savedinstancestate) {       //obtiene los argumentos del fragment     bundle args = getarguments();     int idsubcategoriaarg=0;     if (args  != null && args.containskey("idsubcategoria")) {         idsubcategoriaarg = args.getint("idsubcategoria");         log.e("args productosfragment", args.tostring());     }      // inflate layout fragment     view view = inflater.inflate(r.layout.activity_coordinator2, container, false);      //inicio el dao     this.mproductosdao = new productosdao(getactivity());     //rellena la lista de producto     mlistaproductos= mproductosdao.getproductosdesubcategoria(idsubcategoriaarg);      mrecycler = (recyclerview) view.findviewbyid(r.id.cataloguerv);     mrecycler.sethasfixedsize(true);     // usar un administrador para linearlayout     mlmanager = new linearlayoutmanager(getactivity());     mrecycler.setlayoutmanager(mlmanager);      //inicio el adapter de producto     madapter = new productosadapter(mlistaproductos);     mrecycler.setadapter(madapter);       log.e("productosfragment", ""+mlistaproductos.size());       return view; }   @override public void onattach(activity activity) {     super.onattach(activity);     log.e("productos2fragment", "onattach()");     try {         mlistener = (onsubcategoryselectedlistener) activity;     } catch (classcastexception e) {         throw new classcastexception(activity.tostring() + " must implement onsubcategoryselectedlistener");     } } 

i meet same issue yesterday, , fixed avoiding issue.

here solution:

do not use coordinatorlayout fragment container, say, use listview or framelayout, etc.

<android.support.v4.widget.drawerlayout     xmlns:android="http://schemas.android.com/apk/res/android"     xmlns:app="http://schemas.android.com/apk/res-auto"     android:id="@+id/drawer_layout"     android:layout_width="match_parent"     android:layout_height="match_parent">  <!--the main content view--> <framelayout         android:id="@+id/main_content_layout"         android:layout_width="match_parent"         android:layout_height="match_parent"/> 

make coordinatorlayout fragment instead, , in activity oncreate method, replace container fragment.

@override protected void oncreate(bundle savedinstancestate) {     super.oncreate(savedinstancestate);     setcontentview(r.layout.activity_main);      initview();     setlistener();     setupmainfragment(); }  private void setupmainfragment() {     mainfragment mainfragment = new mainfragment();     getsupportfragmentmanager().begintransaction().replace(r.id.main_content_layout, mainfragment).commit(); } 

as far whether or why coordinatorlayout can't container of fragment, don't know either.

i hope answer may helpful.


Comments