web-dev-qa-db-fra.com

Récupérer le contexte d'un fragment

J'ai créé une classe pour récupérer les commentaires d'un codage JSON à partir d'un fichier PHP. Cette classe, qui s'étend de 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);
    }

}

Comme vous pouvez le constater, j'essaie de montrer un ProgressDialog pendant que le processus "doInBackground" fonctionne. Mais progressDialog, constructeur, demande un contexte et je ne sais pas comment le fournir.

J'appelle cette classe depuis un fragment, je ne peux donc pas accéder au contexte de la manière suivante:

pDialog = new ProgressDialog(MyFragmentA.context);

L'activité "principale" est appelée: AndroidViewPagerActivity qui étend FragmentActivity.

(En gros, je veux dire que c'est celui qui crée les onglets et gère la navigation entre eux.)

C'est son 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));
    }

}

Comment puis-je accéder au contexte? Quel contexte dois-je utiliser? Contexte "AndroidViewPagerActivity"? Alors, comment puis-je accéder à son contexte à partir d'un fragment?

Je vous remercie.

Sergi

16
Reinherd

Utilisez getActivity() dans la Fragment pour obtenir une Context que vous pouvez transmettre. Cela fonctionne, car Activity hérite de Context.

Vous pouvez également utiliser getApplicationContext() pour obtenir Context.

43
Heiko Rupp

La réponse de @ heiko-rupp est obsolète, Fragment.getContext() a été introduit dans Fragments in API 23.

Pour le faire partir d'un fragment, vous devez utiliser, comme this.getContext()

https://developer.Android.com/reference/Android/app/Fragment.html#getContext () qui, selon les documentations, 

Renvoie le contexte auquel ce fragment est actuellement associé.

1
ishandutta2007

Ok, maintenant je sais quelque chose de nouveau:

  • Vous devez obtenir le contexte de la classe qui a instancié le fragment. 

Pour ce faire, vous l'incluez dans votre code dans le fragment ("l'enfant").

Context cont;
cont=getActivity();

Donc, une fois le contexte défini, vous le transmettez. Dans mon cas, je devais lui passer une classe AsyncTask pour pouvoir afficher une boîte de dialogue.

new RecuperarComentarisFoto(cont).execute();

Et pour finir, dans la classe "RecuperarComentarisFoto", j'ai créé un constructeur. Comme je l'ai lu, c'est bon de le faire de cette façon. 

private Context mContext;
public RecuperarComentarisFoto(Context context){
    this.mContext=context;
}

Et la magie:

@Override
protected void onPreExecute() {
    super.onPreExecute();
    ProgressDialog pDialog = new ProgressDialog(this.mContext);
    pDialog.setMessage("Creating Product..");
    pDialog.setIndeterminate(false);
    pDialog.setCancelable(true);
    pDialog.show();
}

Tout cela se termine par: enter image description here

1
Reinherd

FragmentActivity cela vous donnera un contexte d’activité et vous pourrez ensuite le transmettre à votre AsyncTask.

0
Munish Katoch