15

Ho creato una classe per recuperare i commenti da una codifica JSON da un file PHP. Questa classe, si estende da AsyncTask:Recupera contesto da un frammento

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); 
    } 

} 

Come potete vedere, sto cercando di mostrare un ProgressDialog mentre il proccess "doInBackground" sta lavorando. Ma progressDialog costruttore, chiede un contesto, e non so come fornirlo.

Chiamo questa classe da un frammento, quindi non posso accedere al contesto come questo:

pDialog = new ProgressDialog(MyFragmentA.context); 

L'acitivity "principale" si chiama: AndroidViewPagerActivity che si estende FragmentActivity.

(. In principale, voglio dire che è quello che sta creando le schede, e la gestione la navigazione tra loro)

Questo si che è il codice:

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)); 
    } 

} 

Come posso accedere al contesto ? Quale contesto dovrei usare? Contesto "AndroidViewPagerActivity"? Quindi, come posso accedere al suo contesto da un frammento?

Grazie.

Sergi

risposta

43

Usa getActivity() all'interno del Fragment per ottenere un Context che si può passare lungo. Funziona, come Activity eredita da Context.

In alternativa è possibile utilizzare getApplicationContext() per ottenere Context.

+0

Ok, questo ha risolto il problema. Con il tuo aiuto e un po 'di googleing in più, ho capito: D. Andando a mettere il mio codice finale, così ogni 1 può vedere implementata la risposta. – Reinherd

+2

Chiamare getActivity() all'interno del frammento può causare NullPointerException se utilizzato su larga scala per alcuni dispositivi. Ciò accade quando la chiamata viene effettuata prima che il frammento venga collegato all'attività. Risulta anche in perdite di memoria che possono essere fatali e difficili da trovare. Passa attraverso questo per ottenere una migliore comprensione. https://android-developers.googleblog.com/2009/01/avoiding-memory-leaks.html –

0

FragmentActivity questo ti darà contesto di attività e quindi potrai passarlo al tuo AsyncTask.

1

Ok, ora so che qualcosa di nuovo:

  • Hai per ottenere il contesto dalla classe che istanziato il frammento.

Lo si fa inserendo questo nel codice nel frammento ("il bambino").

Context cont; 
cont=getActivity(); 

Quindi, una volta che hai il contesto, lo passi. Nel mio caso, ho dovuto passargli una classe AsyncTask, così posso mostrare una finestra di dialogo.

new RecuperarComentarisFoto(cont).execute(); 

E per finire, nella classe "RecuperarComentarisFoto", ho creato un costruttore. Come ho letto, va bene farlo in questo modo.

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

E la magia:

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

Il tutto si conclude con: enter image description here

Problemi correlati