我创建了一个类来从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构造函数,请求一个Context,我不知道如何提供它。
我是从Fragment调用这个类的,所以我不能像这样访问上下文:
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”上下文?那么如何从片段中访问其上下文?
谢谢。
塞吉
答案 0 :(得分:43)
在getActivity()
内使用Fragment
获取可以传递的Context
。这是有效的,因为Activity
继承自Context
。
作为替代方案,您可以使用getApplicationContext()
获取Context
。
答案 1 :(得分: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();
}
这一切都以:
答案 2 :(得分:1)
Fragment.getContext()
。
要从您必须使用的片段传递它,例如this.getContext()
https://developer.android.com/reference/android/app/Fragment.html#getContext()根据文件
返回此片段当前与之关联的上下文。
答案 3 :(得分:0)
FragmentActivity这将为您提供活动的上下文,然后您可以将其传递给您的AsyncTask。
答案 4 :(得分: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()
相同,但片段获取父活动的上下文被包含在>
这是一种更好的方法,可以让我们的片段更清晰,并明确知道生命周期的上下文来自哪里。