在片段中使用上下文
我怎样才能得到一个片段的上下文?
我需要使用我的数据库的构造函数在上下文中,但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.Fragment的Fragment支持版本。
在覆盖onCreateView时,您也可以从inflater参数获取上下文。
public static class MyFragment extends Fragment { @Override public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { /* ... */ Context context = inflater.getContext(); /* ... */ } }
getActivity()是Context的一个子getActivity() ,所以应该为你工作
你有不同的选择:
- 如果你的minSDK <= 21,那么你可以使用
getActivity(),因为这是一个Context。 - 如果你的minSDK是> = 23,那么你可以使用
getContext()。
如果您不需要支持旧版本,那么使用getContext() 。
理想情况下,你不需要使用全局变量。 该片段有不同的通知,其中之一是onActivityCreated。 您可以在片段的此生命周期事件中获取活动的实例。
然后:你可以取消引用片段来获得活动,上下文或applicationcontext你想要的:
this.getActivity()将为您提供活动的句柄this.getContext()将为您提供上下文的句柄this.getActivity().getApplicationContext()将为您提供应用程序上下文的句柄。 将它传递给数据库时,最好使用应用程序上下文。
简单的方法是使用getActivity() 。 但我认为使用getActivity()方法获取上下文的主要困惑是空指针异常。
为此,首先检查isAdded()方法,它将决定是否添加,然后我们可以使用getActivity()来获取Activity的上下文。
getContext()方法有助于在片段活动中使用类的上下文。
使用支持库中的片段 –
android.support.v4.app.Fragment
然后重写
void onAttach (Context context) { this.context = context; }
这样你可以确定上下文始终是一个非空值。
你可以调用getActivity()或者,
public void onAttach(Context context) { super.onAttach(context); this.activity = (CashActivity) context; this.money = this.activity.money; }