【问题标题】:Retrieve Context from a fragment从片段中检索上下文
【发布时间】:2012-12-19 04:07:37
【问题描述】:

我创建了一个类来从 PHP 文件的 JSON 编码中检索 cmets。这个类,继承自 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”上下文?那么如何从片段中访问它的上下文呢?

谢谢。

塞尔吉

【问题讨论】:

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


    【解决方案1】:

    Fragment 中使用getActivity() 以获得可以传递的Context。这行得通,因为Activity 继承自Context

    您也可以使用getApplicationContext() 来获取Context

    【讨论】:

    • 好的,这解决了问题。在您的帮助和一些额外的谷歌搜索下,我明白了:D。准备放上我的最终代码,这样每个人都能看到实现的答案。
    • 在片段内调用 getActivity() 可能会在某些设备上大规模使用时导致 NullPointerException。当在片段附加到活动之前进行调用时,就会发生这种情况。它还会导致内存泄漏,这可能是致命的并且很难找到。通过这个来获得更好的理解。 android-developers.googleblog.com/2009/01/…
    【解决方案2】:

    @heiko-rupp 的回答已经过时了, Fragment.getContext() 已在 API 23 的 Fragments 中引入。

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

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

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

    【讨论】:

    • 所以它不会在较低的api中工作,使用applicationcontext更好
    【解决方案3】:

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

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

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

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

    这一切都以:

    【讨论】:

      【解决方案4】:

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

      【讨论】:

        【解决方案5】:

        不使用 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() 相同,但片段获取父活动的上下文包含在

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

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2012-02-05
          • 1970-01-01
          • 1970-01-01
          • 2016-10-19
          • 1970-01-01
          • 2013-10-24
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多