20

我创建了一个类来从 PHP 文件的 JSON 编码中检索注释。这个类,从 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);
    }

}

如您所见,我正在尝试在“doInBackground”进程运行时显示 ProgressDialog。但是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”上下文?那么如何从片段中访问它的上下文呢?

谢谢你。

塞尔吉

4

5 回答 5

49

使用getActivity()里面Fragment获得一个Context你可以传递的。这有效,因为Activity继承自Context.

作为替代方案,您可以使用getApplicationContext()来获取Context.

于 2013-01-04T17:30:39.827 回答
2

@heiko-rupp 的答案已过时, Fragment.getContext()已在 API 23 的片段中引入。

要从您必须使用的片段中传递它,例如this.getContext()

https://developer.android.com/reference/android/app/Fragment.html#getContext()根据文档刚刚

返回此片段当前关联的上下文。

于 2017-10-05T08:42:58.810 回答
1

好的,现在我知道了一些新的东西:

  • 您必须从实例化片段的类中获取上下文。

您可以通过在片段(“孩子”)的代码中包含此内容来做到这一点。

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

这一切都以: 在此处输入图像描述

于 2013-01-04T18:21:31.020 回答
0

FragmentActivity 这将为您提供活动的上下文,然后您可以将其传递给您的 AsyncTask。

于 2013-01-04T17:37:44.480 回答
0

不使用 getActivity() 的一个好方法是在片段内创建一个局部可为空的变量

科特林

private var attachedContext: Context? = null 

然后在 onAttach 你将当前上下文对应到片段

 override fun onAttach(context: Context) {
        super.onAttach(context)

        attachedContext = context
}

最后,当您使用它时,您可以检查该上下文是否为空,如果不是,您可以继续

attachedContext?.let { safeContext -> 
 
  // Safe place that you know context is not null

}

作为下一步,我已经放置了调试器,因此您可以看到附加到此变量的上下文是相同的,getActivity()但片段获取父活动的上下文包含在

在此处输入图像描述

这是一种更好的方法,可以让我们的片段更清晰,并在生命周期中明确知道上下文来自何处。

于 2021-05-31T13:45:24.993 回答