在片段中使用上下文
我怎样才能得到一个片段的上下文?
我需要使用我的数据库的构造函数在上下文中,但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; }