Извлечение контекста из фрагмента

Я создал класс для извлечения комментариев из JSON-кодировки из файла PHP. Этот класс, простирается от 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);
    }

}

Как вы можете видеть, я пытаюсь показать ProgressDialog, пока работает "doInBackground". Но progressDialog конструктор, запрашивает контекст, и я не знаю, как его обеспечить.

Я вызываю этот класс из фрагмента, поэтому я не могу получить доступ к контексту, подобному этому:

pDialog = new ProgressDialog(MyFragmentA.context);

"Основная" активность называется: AndroidViewPagerActivity, которая расширяет FragmentActivity.

(В основном я имею в виду, что это тот, который создает вкладки и управляет навигацией между ними.)

Это код:

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

}

Как я могу получить доступ к контексту? Какой контекст я должен использовать? Контекст AndroidViewPagerActivity? Итак, как я могу получить доступ к его контексту из фрагмента?

Спасибо.

Серхи

Ответы

Ответ 1

Используйте getActivity() внутри Fragment, чтобы получить Context, который вы можете передать. Это работает, поскольку Activity наследует от Context.

В качестве альтернативы вы можете использовать getApplicationContext() для получения Context.

Ответ 2

Хорошо, теперь я знаю что-то новое:

  • Вы должны получить контекст из класса, который создавал фрагмент.

Вы делаете это, включив это в свой код в фрагменте ( "ребенок" ).

Context cont;
cont=getActivity();

Итак, как только у вас есть контекст, вы его передаете. В моем случае я должен был передать ему класс AsyncTask, поэтому я могу показать диалог.

new RecuperarComentarisFoto(cont).execute();

И чтобы закончить это, в классе "RecuperarComentarisFoto" я создал конструктор. Как я читал, все в порядке.

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

И волшебство:

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

Все это заканчивается: enter image description here

Ответ 3

@Ответ heiko-rupp устарел,   Fragment.getContext() был введен во Фрагменты в API 23.

Чтобы передать его из фрагмента, который вы должны использовать, например this.getContext()

https://developer.android.com/reference/android/app/Fragment.html#getContext(), который в соответствии с документацией просто

Вернуть контекст, с которым этот фрагмент связан в настоящее время.

Ответ 4

FragmentActivity это даст вам контекст активности, а затем вы можете передать его в свою AsyncTask.