it-swarm.com.ru

Получить контекст из фрагмента

Я создал класс для извлечения комментариев из кодировки 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»? Так как я могу получить доступ к его контексту из фрагмента?

Спасибо.

Sergi

16
Reinherd

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

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

43
Heiko Rupp

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

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

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

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

1
ishandutta2007

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

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

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

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

1
Reinherd

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

0
Munish Katoch