在片段中使用上下文

我怎样才能得到一个片段的上下文?

我需要使用我的数据库的构造函数在上下文中,但getApplicationContext()FragmentClass.this不工作,所以我能做什么?

数据库构造函数

 public Database(Context ctx) { this.context = ctx; DBHelper = new DatabaseHelper(context); } 

您可以使用getActivity() ,它返回与片段相关联的活动。
该活动是一个上下文(由于活动扩展上下文)

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

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

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

最简单也是最精确的方式来获取我发现的片段的上下文是直接从ViewGroup获得它,当你调用onCreateView方法至少在这里你肯定不getActivity()为空:

 public class Animal extends Fragment { Context thiscontext; @Override public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { thiscontext = container.getContext(); 
 @Override public void onAttach(Activity activity) { // TODO Auto-generated method stub super.onAttach(activity); context=activity; } 

获取片段内的上下文将可能使用getActivity()

 public Database() { this.context = getActivity(); DBHelper = new DatabaseHelper(this.context); } 
  • 要小心,使用getActivity()获取与片段相关的Activity ,可以使用它,但不推荐它会导致内存泄漏。

我认为一个更好的方法必须从onAttach()方法获取Activity

 @Override public void onAttach(Activity activity) { super.onAttach(activity); context = activity; } 

另一种替代方法是:

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

 getActivity().getApplicationContext(); 

getContext()在API 23中。代码中的每个地方都用getActivity()代替。

看看它是否修复了错误。 尝试使用处于目标和最小API级别之间的方法,否则这个错误将会到位。

由于API级别23有getContext()但是如果你想支持旧版本,你可以使用getActivity().getApplicationContext()而我仍然建议使用android.support.v4.app.FragmentFragment支持版本。

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

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

你有不同的选择:

  • 如果你的minSDK <= 21,那么你可以使用getActivity() ,因为这是一个Context
  • 如果你的minSDK是> = 23,那么你可以使用getContext()

如果您不需要支持旧版本,那么使用getContext()

getActivity()是Context的一个子getActivity() ,所以应该为你工作

使用支持库中的片段 –

 android.support.v4.app.Fragment 

然后重写

 void onAttach (Context context) { this.context = context; } 

这样你可以确定上下文始终是一个非空值。

理想情况下,你不需要使用全局variables。 该片段有不同的通知,其中之一是onActivityCreated。 您可以在片段的此生命周期事件中获取活动的实例。

然后:你可以取消引用片段来获得活动,上下文或applicationcontext你想要的:

this.getActivity()将为您提供活动的句柄this.getContext()将为您提供上下文的句柄this.getActivity().getApplicationContext()将为您提供应用程序上下文的句柄。 将它传递给数据库时,最好使用应用程序上下文。

简单的方法是使用getActivity() 。 但我认为使用getActivity()方法获取上下文的主要困惑是空指针exception。

为此,首先检查isAdded()方法,它将决定是否添加,然后我们可以使用getActivity()来获取Activity的上下文。

getContext()方法有助于在片段活动中使用类的上下文。

你可以调用getActivity()或者,

 public void onAttach(Context context) { super.onAttach(context); this.activity = (CashActivity) context; this.money = this.activity.money; } 

对于Kotlin,您可以直接在片段中使用context 。 但在某些情况下,你会发现一个错误

types不匹配:推断types是上下文吗? 但上下文是预期的

为此,你可以做到这一点

 val ctx = context ?: return textViewABC.setTextColor(ContextCompat.getColor(ctx, android.R.color.black))