如何获得片段中的上下文?
我需要使用我的数据库,其构造函数接受上下文,但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);
}
当前回答
getContext()来自于API 23。在代码中的任何地方都用getActivity()替换它。
看看它是否修复了错误。尝试使用介于目标和最小API级别之间的方法,否则这个错误就会出现。
其他回答
以前,我使用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如果你的片段当前没有附加到一个父活动,
当覆盖onCreateView时,你也可以从inflater参数获得上下文。
public static class MyFragment extends Fragment {
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) {
/* ... */
Context context = inflater.getContext();
/* ... */
}
}
您可以使用getActivity()方法来获取上下文或 您可以使用getContext()方法。
View root = inflater.inflate(R.layout.fragment_slideshow, container, false);
Context c = root.getContext();
我希望这能有所帮助!
你有不同的选择:
如果你的minSDK <= 21,那么你可以使用getActivity(),因为这是一个Context。 如果你的minSDK是>=23,那么你可以使用getContext()。
如果您不需要支持旧版本,则使用getContext()。
对于Kotlin,您可以直接在片段中使用上下文。但在某些情况下,你会发现这样的错误
类型不匹配:推断类型是上下文?但背景是意料之中的
你可以这样做
val ctx = context ?: return
textViewABC.setTextColor(ContextCompat.getColor(ctx, android.R.color.black))