java - How do I get the context from my fragment for my dagger dependency injection -
note: see update 2 have
currently in fragment's oncreateview(), have adapter recyclerview initialized this:
query query = couchlocaldb.getdatabase().getview(my_view_name).createquery(); livequery livequery = query.tolivequery(); if (myadapter == null) { myadapter = new myadapter(getactivity().getapplication(), new arraylist<>(), getactivity(), livequery); } and constructor of said adapter:
public myadapter(application application, list<myviewholder> myviewholderlist, context context, livequery livequery) { this.myviewholderlist = myviewholderlist; this.context = context; this.livequery = livequery livequery.changelistener listener = new livequery.changelistener() { @override public void changed(livequery.changeevent event) { ((activity)myadapter.this.context).runonuithread(new runnable() { @override public void run() { enumerator = event.getrows(); notifydatasetchanged(); } }); } }; ((mainapplication)application).getappcomponent().inject(this); this.livequery.addchangelistener(listener); this.livequery.start(); } but i'm trying learn how use dagger 2 dependency injection, , think shouldn't have "new" anywhere besides in dagger's appmodule?
so how write provide method in appmodule class when need context of fragment? or doing injection wrong , totally missed idea?
the context variable ever used in line:
((activity)myadapter.this.context).runonuithread(new runnable()... here's have far in appmodule class:
@provides myadapter providemyadapter() { return new myadapter(mainapplication, new arraylist<>(), idk_context, getlivequery); } private livequery getlivequery() { return couchlocaldb.getdatabase().getview(my_view_name).createquery().tolivequery(); } i'm not sure how i'm supposed find way use getactivity() context fragment.
any hint?
update: okay this?
@module public class appmodule { private myfragment myfragment = new myfragment(); // initialize here instead private mainapplication mainapplication; public appmodule(mainapplication mainapplication) { this.mainapplication = mainapplication; } @provides myadapter providemyadapter() { return new myadapter(mainapplication, new arraylist<>(), myfragment.getactivity(), getlivequery()); } @singleton @provides myfragment providemyfragment() { return myfragment; } private livequery getlivequery() { return couchlocaldb.getdatabase().getview(my_view_name).createquery().tolivequery(); } } update 2: ended doing this: added thing provide activity , call day. okay do?
@module public class appmodule { private mainapplication mainapplication; public appmodule(mainapplication mainapplication) { this.mainapplication = mainapplication; } @provides @singleton myadapter providemyadapter(activity activity, livequery livequery) { return new myadapter(mainapplication, new arraylist<>(), activity, livequery); } @provides @singleton myfragment providemyfragment() { return new myfragment(); } // added method , let provide activity provideadapter method. @provides @singleton activity provideactivity(myfragment myfragment) { return myfragment.getactivity(); } @provides @singleton livequery providelivequery() { return couchlocaldb.getdatabase().getview(my_view_name).createquery().tolivequery(); } } here's new constructor
public myadapter(application application, list<myviewholder> myviewholderlist, activity activity, livequery livequery) { this.myviewholderlist = myviewholderlist; this.livequery = livequery livequery.changelistener listener = new livequery.changelistener() { @override public void changed(livequery.changeevent event) { (activity).runonuithread(new runnable() { @override public void run() { enumerator = event.getrows(); notifydatasetchanged(); } }); } }; ((mainapplication)application).getappcomponent().inject(this); this.livequery.addchangelistener(listener); this.livequery.start(); } is okay thing do? not bad practice or anything?
you can use getactivity(), returns activity associated fragment.
activity context (since activity extends context).
here's example context in fragment :
//import android.app.fragment; import android.support.v4.app.fragment public class calendarfragment extends fragment { static context mcontext = null; //member variable ... @override public view oncreateview(layoutinflater inflater, viewgroup container, bundle savedinstancestate) { mcontext = this.getactivity(); //set mcontext ((activity) mcontext).startmanagingcursor(notescursor);//cast activity ...
Comments
Post a Comment