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
Post a Comment