如何在片段中获取上下文?
我需要使用我的数据库,其构造函数在上下文中,但getApplicationContext()
和FragmentClass.this
不起作用,所以我该怎么办?
数据库构造函数
public Database(Context ctx)
{
this.context = ctx;
DBHelper = new DatabaseHelper(context);
}
你可以使用getActivity()
,它返回与fragment
相关的活动。
活动是context
(因为Activity
扩展Context
)。
fragment
来自API 23.在代码中的任何地方用getActivity()替换它。
看看它是否修复了错误。尝试使用目标和最小API级别之间的方法,否则会出现此错误。
由于API级别23有activity
但是如果你想支持旧版本,你可以使用getContext()
,而我仍然建议使用getContext()
的支持版本getActivity().getApplicationContext()
。
Fragment
是Context的孩子,所以应该适合你
使用支持库中的片段 -
android.support.v4.app.Fragment
然后覆盖
getActivity()
这样,您可以确保上下文始终为非null值。
你有不同的选择:
android.support.v4.app.Fragment
,因为这是一个void onAttach (Context context) {
this.context = context;
}
。getActivity()
。如果您不需要支持旧版本,请使用Context
。
对于Kotlin,您可以直接在片段中使用getContext()
。但在某些情况下你会发现一个错误
类型不匹配:推断类型是Context?但是上下文是预期的
为此你可以做到这一点
getContext()
理想情况下,您不需要使用全局变量。该片段具有不同的通知,其中一个是onActivityCreated。您可以在片段的此生命周期事件中获取活动的实例。
然后:您可以根据需要取消引用片段以获取活动,上下文或applicationcontext:
context
将为您提供活动的句柄val ctx = context ?: return
textViewABC.setTextColor(ContextCompat.getColor(ctx, android.R.color.black))
将为您提供上下文的句柄this.getActivity()
将为您提供应用程序上下文的句柄。最好在将应用程序上下文传递给db时使用它。
简单的方法是使用this.getContext()
。但我认为使用this.getActivity().getApplicationContext()
方法获取上下文的主要困惑是空指针异常。
为此,首先使用getActivity()
方法检查是否已添加,然后我们可以使用getActivity()
来获取Activity的上下文。
你可以打电话给isAdded()
或者,
getActivity()
在kotlin只需使用getActivity()
而不是public void onAttach(Context context) {
super.onAttach(context);
this.activity = (CashActivity) context;
this.money = this.activity.money;
}
要做到上面的答案,你可以覆盖片段的onAttach
方法:
public static class DummySectionFragment extends Fragment{
...
@Override
public void onAttach(Activity activity) {
super.onAttach(activity);
DBHelper = new DatabaseHelper(activity);
}
}
getContext()方法有助于在片段活动中使用类的Context。
我想你可以用
activity
getActivity()
你也可以使用:
public static class MyFragment extends Fragment {
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) {
Context context = getActivity.getContext();
}
}
但我更愿意使用
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;
}
}
要么
inflater.getContext();
我需要使用arrayAdapter IN片段的上下文,当我使用getActivity时出现错误但是当我用getContext替换它时它适用于我
getActivity()
getContext
or listView LV=getView().findViewById(R.id.listOFsensors);
LV.setAdapter(new ArrayAdapter<String>(getContext(),android.R.layout.simple_list_item_1 ,listSensorType));
in Fragment.文档
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();
}
,因为当片段未附加到活动时它可以为null。有时在片段中进行长时间操作(比如从rest api获取数据)需要一些时间。如果用户导航到另一个片段。然后getActivity将为null。如果你没有处理它,你会得到NPE。
在你片段
/**
* 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)
始终使用getActivity()方法获取附加活动的上下文,但始终记住一件事:片段稍微不稳定,getActivity
有时会返回null,所以为此,在获取isAdded()的上下文之前,请始终检查片段的getActivity()
方法。
获取我发现的片段的上下文的最简单,最精确的方法是,当你至少在这里调用ViewGroup
方法时直接从onCreateView
获取它,你肯定不会为getActivity()
得到null:
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()
可以获得Fragment中的上下文:
public Database()
{
this.context = getActivity();
DBHelper = new DatabaseHelper(this.context);
}
Activity
获取与片段相关联的getActivity()
,您可以使用它,但不建议它会导致内存泄漏。我认为更好的方法必须是从qazxsw poi方法获得qazxsw poi:
Activity
当覆盖onAttach()
时,您还可以从@Override
public void onAttach(Activity activity) {
super.onAttach(activity);
context = activity;
}
参数获取上下文。
inflater
另一种替代方法是:
您可以使用以下方式获取上下文
onCreateView
以前我用public static class MyFragment extends Fragment {
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) {
/* ... */
Context context = inflater.getContext();
/* ... */
}
}
在getActivity().getApplicationContext();
获得onAttach (Activity activity)
问题
context
方法在API级别23中已弃用。
解
现在要获得Fragment
的背景,我们可以使用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
,