如何在片段中获取上下文?
我需要使用我的数据库,其构造函数接受上下文,但getApplicationContext()
和FragmentClass.this
不起作用,我该怎么办?
数据库构造函数
public Database(Context ctx)
{
this.context = ctx;
DBHelper = new DatabaseHelper(context);
}
答案 0 :(得分:1227)
您可以使用getActivity()
,它会返回与fragment
相关联的活动
该活动为context
(自Activity
扩展Context
)。
答案 1 :(得分:127)
要做上面的答案,你可以覆盖片段的onAttach
方法:
public static class DummySectionFragment extends Fragment{
...
@Override
public void onAttach(Activity activity) {
super.onAttach(activity);
DBHelper = new DatabaseHelper(activity);
}
}
答案 2 :(得分:24)
始终使用getActivity()方法获取附加活动的上下文,但始终记住一件事:片段稍微不稳定,getActivity
有时会返回null,所以为此,请务必检查{ {3}}在getActivity()
获取上下文之前的片段方法。
答案 3 :(得分:18)
获取我发现的片段上下文的最简单,最精确的方法是,至少在此处调用ViewGroup
方法时直接从onCreateView
获取它,您肯定不会得到null getActivity()
:
public class Animal extends Fragment {
Context thiscontext;
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState)
{
thiscontext = container.getContext();
答案 4 :(得分:9)
@Override
public void onAttach(Activity activity) {
// TODO Auto-generated method stub
super.onAttach(activity);
context=activity;
}
答案 5 :(得分:5)
可以使用getActivity()
:
public Database()
{
this.context = getActivity();
DBHelper = new DatabaseHelper(this.context);
}
Activity
获取与片段相关联的getActivity()
,您可以使用它,但不建议它会导致内存泄漏。我认为更好的方法必须是从Activity
方法获取onAttach()
:
@Override
public void onAttach(Activity activity) {
super.onAttach(activity);
context = activity;
}
答案 6 :(得分:4)
另一种替代方法是:
您可以使用以下方式获取上下文:
getActivity().getApplicationContext();
答案 7 :(得分:3)
getContext()
来自API 23.在代码中的任何地方用getActivity()替换它。
看看它是否修复了错误。尝试使用目标和最小API级别之间的方法,否则会出现此错误。
答案 8 :(得分:3)
当覆盖inflater
时,您还可以从onCreateView
参数获取上下文。
public static class MyFragment extends Fragment {
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) {
/* ... */
Context context = inflater.getContext();
/* ... */
}
}
答案 9 :(得分:3)
以前,我使用onAttach (Activity activity)
来获取context
中的Fragment
问题
在API级别23中不推荐使用onAttach (Activity activity)
方法。
解决方案
现在要在Fragment
中获取上下文,我们可以使用onAttach (Context 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;
}
}
我们还可以使用 getActivity()
在context
中获取Fragments
但如果您的getActivity()
当前未附加到父级null
,则fragment
可以返回activity
,
答案 10 :(得分:3)
由于API级别23有getContext()
,但如果您想支持旧版本,则可以使用getActivity().getApplicationContext()
,而我仍然建议使用Fragment
的支持版android.support.v4.app.Fragment
}。
答案 11 :(得分:2)
使用支持库 -
中的片段android.support.v4.app.Fragment
然后覆盖
void onAttach (Context context) {
this.context = context;
}
通过这种方式,您可以确保上下文始终为非空值。
答案 12 :(得分:2)
在片段中获取上下文的安全方法
if(isAdded){
requireActivit();//this is your context
}
答案 13 :(得分:2)
使用Kotlin上的API 29 + ,我必须这样做
activity?.applicationContext!!
一个例子是
ContextCompat.getColor(activity?.applicationContext!!, R.color.colorAccent),
答案 14 :(得分:2)
对于Kotlin,您可以直接在片段中使用context
。但在某些情况下你会发现像
类型不匹配:推断类型是Context?但是上下文是预期的
为此你可以做到这一点
val ctx = context ?: return
textViewABC.setTextColor(ContextCompat.getColor(ctx, android.R.color.black))
答案 15 :(得分:2)
您有不同的选择:
getActivity()
,因为这是Context
。getContext()
。如果您不需要支持旧版本,请使用getContext()
。
答案 16 :(得分:2)
getActivity()
是Context的孩子,因此应该适合你
答案 17 :(得分:1)
理想情况下,您不需要使用全局变量。该片段具有不同的通知,其中一个是onActivityCreated。您可以在片段的此生命周期事件中获取活动的实例。
然后:您可以根据需要取消引用片段以获取活动,上下文或applicationcontext:
this.getActivity()
会为您提供活动的句柄
this.getContext()
将为您提供上下文的句柄
this.getActivity().getApplicationContext()
将为您提供应用程序上下文的句柄。最好在将应用程序上下文传递给db时使用它。
答案 18 :(得分:1)
简单的方法是使用getActivity()
。但我认为使用getActivity()
方法获取上下文的主要困惑是空指针异常。
为此,首先使用isAdded()
方法检查是否已添加,然后我们可以使用getActivity()
获取活动的上下文。
答案 19 :(得分:1)
requireContext()方法是最简单的选择
requireContext()
示例
MyDatabase(requireContext())
答案 20 :(得分:0)
getContext()方法有助于在片段活动中使用类的上下文。
答案 21 :(得分:0)
我认为你可以使用
public static class MyFragment extends Fragment {
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) {
Context context = getActivity.getContext();
}
}
答案 22 :(得分:0)
public class MenuFragment extends Fragment implements View.OnClickListener {
private Context mContext;
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
FragmentMenuBinding binding=FragmentMenuBinding.inflate(inflater,container,false);
View view=binding.getRoot();
mContext=view.getContext();
return view;
}
}
答案 23 :(得分:0)
您也可以使用:
inflater.getContext();
但我更愿意使用
getActivity()
或
getContext
答案 24 :(得分:0)
getActivity()
或getContext
。<强>文档强>
/**
* Return the {@link FragmentActivity} this fragment is currently associated with.
* May return {@code null} if the fragment is associated with a {@link Context}
* instead.
*
* @see #requireActivity()
*/
@Nullable
final public FragmentActivity getActivity() {
return mHost == null ? null : (FragmentActivity) mHost.getActivity();
}
和
/**
* Return the {@link Context} this fragment is currently associated with.
*
* @see #requireContext()
*/
@Nullable
public Context getContext() {
return mHost == null ? null : mHost.getContext();
}
始终检查 if(getActivity!=null)
,因为当片段未附加到活动时,它可以为空。有时在片段中进行长时间操作(比如从rest api获取数据)需要一些时间。如果用户导航到另一个片段。然后getActivity将为null。如果你没有处理它,你会得到NPE。
答案 25 :(得分:0)
我需要使用arrayAdapter IN片段的上下文,当我使用 getActivity 时发生错误,但是当我将其替换为 getContext 时,它将为我工作
listView LV=getView().findViewById(R.id.listOFsensors);
LV.setAdapter(new ArrayAdapter<String>(getContext(),android.R.layout.simple_list_item_1 ,listSensorType));
答案 26 :(得分:0)
关于您的片段
((Name_of_your_Activity) getActivity()).helper
活动中
DbHelper helper = new DbHelper(this);
答案 27 :(得分:0)
在 kotlin 中,只需使用activity
而不是getActivity()
答案 28 :(得分:0)
您可以使用getActivity()方法获取上下文或 您可以使用getContext()方法。
View root = inflater.inflate(R.layout.fragment_slideshow, container, false);
Context c = root.getContext();
希望对您有帮助!
答案 29 :(得分:0)
kotlin样品的内部碎片会帮助某人
textViewStatus.setTextColor(ContextCompat.getColor(context!!, R.color.red))
如果您使用数据绑定;
bindingView.textViewStatus.setTextColor(ContextCompat.getColor(context!!, R.color.red))
像这样在 onCreateView 中初始化bindingView的地方
private lateinit var bindingView: FragmentBookingHistoryDetailBinding
bindingView = DataBindingUtil.inflate(inflater, R.layout.your_layout_xml, container, false)
答案 30 :(得分:0)
您可以使用 getActivity(),它返回与片段关联的活动。 Activity 是一个上下文(因为 Activity 扩展了 Context)。