如何在Fragment中获取上下文?
我需要使用需要上下文作为构造函数参数的数据库,但是getApplicationContext()
和FragmentClass.this
都不起作用,那么我该怎么办?
数据库构造函数
public Database(Context ctx)
{
this.context = ctx;
DBHelper = new DatabaseHelper(context);
}
如何在Fragment中获取上下文?
我需要使用需要上下文作为构造函数参数的数据库,但是getApplicationContext()
和FragmentClass.this
都不起作用,那么我该怎么办?
数据库构造函数
public Database(Context ctx)
{
this.context = ctx;
DBHelper = new DatabaseHelper(context);
}
按照上面的答案,您可以重写片段的onAttach
方法:
public static class DummySectionFragment extends Fragment{
...
@Override
public void onAttach(Activity activity) {
super.onAttach(activity);
DBHelper = new DatabaseHelper(activity);
}
}
DatabaseHelper
需要一个 FragmentActivity
而不是一个 Activity
,那该怎么办呢?例如,在一个 Adapter
中… - JagoonAttach(Activity activity)
中存储了对您的活动的引用,则应在onDetach()
中释放它。 - vovahost我发现获取片段上下文最简单和最精确的方法是在调用 onCreateView 方法时直接从
ViewGroup 中获取,至少在这里您可以确保不会得到
getActivity() 的null值:
<code><code><code>public class Animal extends Fragment {
Context thiscontext;
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState)
{
thiscontext = container.getContext();
</code></code></code>
使用getActivity()方法来获取所依附的活动的上下文,但需要记住一点:片段(Fragments)有些不稳定,getActivity()
有时会返回null,因此在使用getActivity()
之前,请始终检查片段的isAdded()方法。
正确的方法是使用
requireContext()
以及这个例子
ContextCompat.getColor(requireContext(), R.color.colorAccent),
requireContext()
可能会抛出异常时,它如何被认为是正确的?我认为这是一种有害的使用方式。 - YaMiN之前我在Fragment
中使用onAttach(Activity activity)
来获取context
问题
onAttach(Activity activity)
方法在API级别23中已被弃用。
解决方案
现在我们可以使用onAttach(Context context)
来获取Fragment
中的context
onAttach(Context context)
context
时调用。之后将调用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;
}
}
在Fragments
中,我们也可以使用getActivity()
来获取context
,但是如果您的fragment
当前未附加到父activity
,则getActivity()
可能会返回null
。
requireContext()方法是最简单的选项
requireContext()
例子
MyDatabase(requireContext())
@Override
public void onAttach(Activity activity) {
// TODO Auto-generated method stub
super.onAttach(activity);
context=activity;
}
当重写onCreateView
时,您还可以从inflater
参数中获取上下文。
public static class MyFragment extends Fragment {
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) {
/* ... */
Context context = inflater.getContext();
/* ... */
}
}
另一种替代方法是:
您可以使用以下方式获取上下文:
getActivity().getApplicationContext();
getActivity().getApplicationContext()
的值存储在一个实例变量中,然后在片段类中任何需要使用该上下文时都可以使用它。这个上下文将在片段分离后保留下来。 - Piovezan