Reputation: 5504
I created a class to retrieve comments from a JSON encoding from a PHP file. This class, extends from AsyncTask:
public class RecuperarComentarisFoto extends AsyncTask<String, String, String>{
@Override
protected void onPreExecute() {
super.onPreExecute();
pDialog = new ProgressDialog(????);
pDialog.setMessage("Creating Product..");
pDialog.setIndeterminate(false);
pDialog.setCancelable(true);
pDialog.show();
}
@Override
protected String doInBackground(String... arg0) {
// TODO Auto-generated method stub
return null;
}
@Override
protected void onPostExecute(String result) {
// TODO Auto-generated method stub
super.onPostExecute(result);
}
}
As you can see, I'm trying to show a ProgressDialog while the "doInBackground" proccess is working. But progressDialog constructor, asks for a Context, and I don't know how to provide it.
I'm calling this class from a Fragment, so I can't access the context like this:
pDialog = new ProgressDialog(MyFragmentA.context);
The "main" acitivity is called: AndroidViewPagerActivity which extends FragmentActivity.
(By main, I mean that it's the one that is creating the tabs, and managing the navigation between them.)
This is it's code:
public class AndroidViewPagerActivity extends FragmentActivity {
ViewPager mViewPager;
TabsAdapter mTabsAdapter;
/** Called when the activity is first created. */
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
mViewPager = new ViewPager(this);
mViewPager.setId(R.id.pager);
setContentView(mViewPager);
final ActionBar bar = getActionBar();
bar.setNavigationMode(ActionBar.NAVIGATION_MODE_TABS);
bar.setDisplayOptions(0, ActionBar.DISPLAY_SHOW_HOME);
bar.hide();
mTabsAdapter = new TabsAdapter(this, mViewPager);
mTabsAdapter.addTab(bar.newTab().setText("Fragment A"), MyFragmentA.class, null);
if (savedInstanceState != null) {
bar.setSelectedNavigationItem(savedInstanceState.getInt("tab", 0));
}
}
How can I access the context? Which context should I use? "AndroidViewPagerActivity" context? So how can I access its context from a fragment?
Thank you.
Sergi
Upvotes: 20
Views: 51051
Reputation: 13159
A great way without using getActivity() is creating a local nullable variable inside the fragment
private var attachedContext: Context? = null
Then in onAttach you correspond the current context to the fragment
override fun onAttach(context: Context) {
super.onAttach(context)
attachedContext = context
}
Lastly when you use it you can check if that context is null, if not you can proceed
attachedContext?.let { safeContext ->
// Safe place that you know context is not null
}
As a next step, I have placed the debugger so you can see that the context attached to this variable is the same one as getActivity()
but the fragments get the context of the parent activity is being contained on
This is a better way to be cleaner in our fragments and explicitly know where the context is coming from with the lifecycle.
Upvotes: 1
Reputation: 18284
@heiko-rupp's answer is outdated,
Fragment.getContext()
has been introduced in Fragments in API 23.
To pass it around from fragment you have to use, like this.getContext()
https://developer.android.com/reference/android/app/Fragment.html#getContext() which according to documentations just
Return the Context this fragment is currently associated with.
Upvotes: 3
Reputation: 5504
Okay, now I know something new:
You do this by including this in your code in the fragment ("the child").
Context cont;
cont=getActivity();
So then, once you've the context, you pass it. In my case, I had to pass it a AsyncTask class, so I can show a dialog.
new RecuperarComentarisFoto(cont).execute();
And to finish this, on the "RecuperarComentarisFoto" class, I created a constructor. As I've read, it's ok to do it this way.
private Context mContext;
public RecuperarComentarisFoto(Context context){
this.mContext=context;
}
And the magic:
@Override
protected void onPreExecute() {
super.onPreExecute();
ProgressDialog pDialog = new ProgressDialog(this.mContext);
pDialog.setMessage("Creating Product..");
pDialog.setIndeterminate(false);
pDialog.setCancelable(true);
pDialog.show();
}
This all ends with:
Upvotes: 1
Reputation: 517
FragmentActivity this will give you context of activity and then you can pass it to your AsyncTask.
Upvotes: 0
Reputation: 30994
Use getActivity()
inside the Fragment
to obtain a Context
that you can pass along. That works, as Activity
inherits from Context
.
As alternative you can use getApplicationContext()
to obtain the Context
.
Upvotes: 49