Retrieve Context from a fragment

2019-01-22 20:35发布

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

4条回答
唯我独甜
2楼-- · 2019-01-22 20:49

FragmentActivity this will give you context of activity and then you can pass it to your AsyncTask.

查看更多
闹够了就滚
3楼-- · 2019-01-22 20:52

@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.

查看更多
叛逆
4楼-- · 2019-01-22 21:00

Okay, now I know something new:

  • You've to get the context from the class that instanced the fragment.

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: enter image description here

查看更多
We Are One
5楼-- · 2019-01-22 21:12

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.

查看更多
登录 后发表回答