从片段中检索上下文

时间:2013-01-04 17:28:46

标签: java android android-fragments android-asynctask android-context

我创建了一个类来从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”上下文?那么如何从片段中访问其上下文?

谢谢。

塞吉

5 个答案:

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

这一切都以: enter image description here

答案 2 :(得分:1)

@ heiko-rupp的回答已经过时了  API 23中的Fragments中引入了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() 相同,但片段获取父活动的上下文被包含在

enter image description here

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