在片段中使用上下文

tyc*_*czj 645 java android android-context android-fragments

如何在片段中获取上下文?

我需要用我的数据库其构造函数采用的背景下,但getApplicationContext()FragmentClass.this没有工作,所以我能做些什么?

数据库构造函数

public Database(Context ctx)
{
    this.context = ctx;
    DBHelper = new DatabaseHelper(context);
}
Run Code Online (Sandbox Code Playgroud)

小智 1270

您可以使用getActivity(),它返回与a关联的活动fragment.
活动是context (自Activity扩展以来Context).

  • 如果在相应片段的onAttach之前调用它,则getActivity()可以返回null. (207认同)
  • 分离片段问题的解决方案是在创建片段时将`getActivity().getApplicationContext()`的值存储在实例变量中,然后在片段类中随时使用该上下文.这种情况将在碎片分离中存活下来. (38认同)
  • 而不是传递应用程序上下文,在Application类中创建一个静态上下文并在onCreate()上初始化它:MyApplication.sContext = getApplicationContext(); 然后你可以从任何活动/片段访问它而不用担心脱离. (7认同)
  • 我正在阅读关于内存泄漏的Google博客... http://android-developers.blogspot.com/2009/01/avoiding-memory-leaks.html.如果我使用getActivity()方法,应用程序不会有内存泄漏的风险?博客建议"尝试使用上下文应用程序而不是上下文活动",这实际上是不可能的,因为getApplicationContext()仅适用于Activity类而不适用于Fragment类. (4认同)
  • @milaniez:`getActivity`一直可用.这是在API 23中添加的`getContext`. (3认同)
  • @EduardKotysh 内存泄漏真是一个美丽的欢迎派对:) (3认同)
  • @Prof 我已经很多年没有使用 Android 了,但我不这么认为。如果您仅保留应用程序上下文的引用(顾名思义,它持续整个应用程序生命周期),那么您不会阻止任何东西比通常更快(更长?对不起我的英语)被垃圾收集。基于同样的原则,Eduko 在我下面的建议似乎也不错。 (2认同)

小智 128

要做上面的答案,你可以覆盖onAttach片段的方法:

public static class DummySectionFragment extends Fragment{
...
    @Override
    public void onAttach(Activity activity) {
        super.onAttach(activity);
        DBHelper = new DatabaseHelper(activity);
    }
}
Run Code Online (Sandbox Code Playgroud)

  • 但是,请记住,当调用onAttach()时,没有视图.所以你不能对观点做任何事情! (7认同)
  • 如果你在`onAttach(Activity activity)`中存储对你的活动的引用,你应该在`onDetach()中释放它. (4认同)
  • 我建议这样做,因为如果尚未调用onAttach,则getActivity()返回null. (3认同)
  • 'onAttach`方法已被弃用,`覆盖'android.support.v4.app.Fragment'中的弃用方法 (3认同)
  • @iambox如果`DatabaseHelper`需要一个`FragmentActivity`而不是`Activity`怎么办?例如,对于"适配器"...... (2认同)

Mar*_*rty 25

正确的方法是使用

requireContext()
Run Code Online (Sandbox Code Playgroud)

和例子

ContextCompat.getColor(requireContext(), R.color.colorAccent),
Run Code Online (Sandbox Code Playgroud)


Ank*_*ary 24

始终使用getActivity()方法获取附加活动的上下文,但始终记住一件事:碎片稍微不稳定并且getActivity有时会返回null,因此,在获取上下文之前,请始终检查片段的isAdded()方法getActivity().

  • 我不会说片段"稍微不稳定",当片段不属于某个活动时,getActivity()返回null似乎很正常.假设getActivity()"不应该返回null"(这是错误的)会使您的应用程序(而不是Fragment类)不稳定. (14认同)
  • @ personne3000我想听听更多.什么时候片段不属于活动?这是什么时候发生的?为什么?我们应该检查片段中的isAdded()以使用getActivity()吗?任何经验法则? (3认同)
  • @Sotti我鼓励你为此创建一个新问题(或寻找现有问题),因为这个特定主题与原始问题略有不同.您可以查看http://developer.android.com/guide/components/fragments.html#Lifecycle以获取一般信息.基本上,在onAttach之前和onDetach之后,没有任何活动.在onAttach和onActivityCreated之间,活动的onCreate还没有被调用.使用getActivity()时,请确保您的活动已经创建,并考虑如果它被销毁或您的片段被分离会发生什么. (2认同)

小智 19

获取我发现的片段的上下文的最简单,最精确的方法是直接从ViewGroup你调用onCreateView方法的时候得到它至少在这里你肯定不会得到null getActivity():

public class Animal extends Fragment { 
  Context thiscontext;
  @Override
  public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState)
  {
    thiscontext = container.getContext();
Run Code Online (Sandbox Code Playgroud)

  • 这是容器的上下文,我认为......不是"这个背景". (10认同)
  • 实际上在dialogFragments上,容器**可以为null.小心点! (3认同)
  • @ AG1你可以解释为什么它崩溃了你的代码?这是迄今为止我得到的最佳解决方案 (2认同)

小智 10

@Override
public void onAttach(Activity activity) {
    // TODO Auto-generated method stub
    super.onAttach(activity);
    context=activity;
}
Run Code Online (Sandbox Code Playgroud)


小智 8

requireContext() 方法是最简单的选择

requireContext()
Run Code Online (Sandbox Code Playgroud)

例子

MyDatabase(requireContext())
Run Code Online (Sandbox Code Playgroud)


Nil*_*hod 7

以前我是onAttach (Activity activity)用来进去contextFragment

问题

onAttach (Activity activity)方法已在API级别23中弃用。

现在获取上下文, Fragment我们可以使用onAttach (Context context)

onAttach (Context context)

  • 片段首次附加到时调用contextonCreate(Bundle)在此之后将被调用。

文献资料

/**
 * Called when a fragment is first attached to its context.
 * {@link #onCreate(Bundle)} will be called after this.
 */
@CallSuper
public void onAttach(Context context) {
    mCalled = true;
    final Activity hostActivity = mHost == null ? null : mHost.getActivity();
    if (hostActivity != null) {
        mCalled = false;
        onAttach(hostActivity);
    }
}
Run Code Online (Sandbox Code Playgroud)

样本代码

public class FirstFragment extends Fragment {


    private Context mContext;
    public FirstFragment() {
        // Required empty public constructor
    }

    @Override
    public void onAttach(Context context) {
        super.onAttach(context);
        mContext=context;
    }

    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container,
                             Bundle savedInstanceState) {
        View rooView=inflater.inflate(R.layout.fragment_first, container, false);

        Toast.makeText(mContext, "THIS IS SAMPLE TOAST", Toast.LENGTH_SHORT).show();
        // Inflate the layout for this fragment
        return rooView;
    }

}
Run Code Online (Sandbox Code Playgroud)

注意

我们也可以用getActivity()得到contextFragments ,但getActivity()可以返回null,如果您 fragment当前未连接到父activity


cod*_*cat 5

另一种替代方法是:

您可以使用以下方式获取上下文:

getActivity().getApplicationContext();
Run Code Online (Sandbox Code Playgroud)


Jor*_*sys 5

使用以下方法获取Fragment中的上下文getActivity():

public Database()
{
    this.context = getActivity();
    DBHelper = new DatabaseHelper(this.context);
}
Run Code Online (Sandbox Code Playgroud)
  • 注意,要Activity使用与片段相关联getActivity(),您可以使用它,但不建议它会导致内存泄漏.

我认为更好ActivityonAttach()方法必须是从方法中得到:

@Override
public void onAttach(Activity activity) {
    super.onAttach(activity);
    context = activity;
}
Run Code Online (Sandbox Code Playgroud)


lui*_*fls 5

inflater覆盖时,您还可以从参数获取上下文onCreateView

public static class MyFragment extends Fragment {
    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container,
                                 Bundle savedInstanceState) {
        /* ... */
        Context context = inflater.getContext();
        /* ... */
    }
}
Run Code Online (Sandbox Code Playgroud)


小智 5

您可以使用 getActivity() 方法来获取上下文,也可以使用 getContext() 方法。

View root = inflater.inflate(R.layout.fragment_slideshow, container, false);
Context c = root.getContext();
Run Code Online (Sandbox Code Playgroud)

我希望它有帮助!