Android:Fragment 新的 getContext() 方法是哪个上下文?

Posted

技术标签:

【中文标题】Android:Fragment 新的 getContext() 方法是哪个上下文?【英文标题】:Android: Fragment's new getContext() method is which context? 【发布时间】:2015-12-03 14:44:29 【问题描述】:

Fragment.getContext() 的文档是这样说的

返回 Fragment 当前关联的上下文。

在 api 23 中引入 http://developer.android.com/reference/android/app/Fragment.html#getContext()

这是Application 还是Activity Context

【问题讨论】:

***.com/questions/8215308/using-context-in-fragment 【参考方案1】:

简答

Fragment.getContext()返回使用fragment的activity的上下文

详情

由于Fragment类中的api 23被引入mHost字段

// Activity this fragment is attached to.
FragmentHostCallback mHost;

Fragment.getContext() 使用它来获取上下文:

/**
 * Return the @link Context this fragment is currently associated with.
 */
public Context getContext() 
    return mHost == null ? null : mHost.getContext();

在片段的getContext() 方法中获取 Activity 的上下文之前有几个步骤。

1) 在Activity的初始化过程中FragmentController被创建:

final FragmentController mFragments = FragmentController.createController(new HostCallbacks());

2) 它使用HostCallbacks 类(Activity 的内部类)

class HostCallbacks extends FragmentHostCallback<Activity> 
    public HostCallbacks() 
        super(Activity.this /*activity*/);
    
...

3) 如您所见,mFragments 保留对活动上下文的引用。

4) 当应用程序创建一个片段时,它使用FragmentManager。它的实例取自mFragments(从API级别23开始)

/**
 * Return the FragmentManager for interacting with fragments associated
 * with this activity.
 */
public FragmentManager getFragmentManager() 
    return mFragments.getFragmentManager();

5) 最后,Fragment.mHost 字段在FragmentManager.moveToState(Fragment f, int newState, int transit, int transitionStyle, boolean keepActive) 方法中设置。

【讨论】:

令人沮丧。 android 中长期以来引入的最有用的方法,但需要 API 23,这意味着任何严肃的项目都不太可能使用它至少几年。【参考方案2】:

至于 FragmentActivity 和继承 - 'getContext()' 仍然会返回活动上下文,如果你检查源代码,你可能会看到。

【讨论】:

你是对的,但问题是关于新的Fragment#getContext(),而不是FragmentActivity#getContext() 我说的是Fragment#getContext()

以上是关于Android:Fragment 新的 getContext() 方法是哪个上下文?的主要内容,如果未能解决你的问题,请参考以下文章

Android 微信 底部tab 切换时是新的activity 还是 fragment

android fragment 刷新功能

在 Fragment 中设置一个新的 ListAdapter

Android中Fragment的使用

fragment需不需要在android manifest里注册

Android Fragment的特点