如何获得片段中的上下文?
我需要使用我的数据库,其构造函数接受上下文,但getApplicationContext()和FragmentClass。这个不管用,我该怎么办?
数据库的构造函数
public Database(Context ctx)
{
this.context = ctx;
DBHelper = new DatabaseHelper(context);
}
如何获得片段中的上下文?
我需要使用我的数据库,其构造函数接受上下文,但getApplicationContext()和FragmentClass。这个不管用,我该怎么办?
数据库的构造函数
public Database(Context ctx)
{
this.context = ctx;
DBHelper = new DatabaseHelper(context);
}
当前回答
正确的方法是使用
requireContext()
这个例子
ContextCompat.getColor(requireContext(), R.color.colorAccent),
其他回答
你可以调用getActivity()或者,
public void onAttach(Context context) {
super.onAttach(context);
this.activity = (CashActivity) context;
this.money = this.activity.money;
}
理想情况下,您不应该使用全局变量。这个片段有不同的通知,其中一个是onActivityCreated。您可以在这个片段的生命周期事件中获得活动的实例。
然后:你可以解引用片段来获得activity, context或applicationcontext:
this.getActivity()会给你activity的句柄 this.getContext()会给你一个上下文句柄 this.getActivity(). getapplicationcontext()将为您提供应用程序上下文的句柄。在将它传递给db时,最好使用应用程序上下文。
我想你可以用
public static class MyFragment extends Fragment {
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) {
Context context = getActivity.getContext();
}
}
以前,我使用onAttach(活动活动)来获取片段中的上下文
问题
onAttach (Activity Activity)方法在API级别23中已弃用。
解决方案
现在要在Fragment中获取context我们可以使用onAttach (context context)
onAttach(上下文上下文)
当一个片段第一次附加到它的上下文时调用。onCreate(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);
}
}
示例代码
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;
}
}
NOTE
我们也可以使用getActivity()来获取fragment中的上下文 但是getActivity()可以返回null如果你的片段当前没有附加到一个父活动,
始终使用getActivity()方法获取附加活动的上下文,但始终记住一件事:片段有点不稳定,getActivity有时返回null,因此,在通过getActivity()获取上下文之前,始终检查片段的isAdded()方法。