在片段中使用上下文

如何获取片段中的上下文?

我需要使用其构造函数在上下文中接受的数据库,但是getApplicationContext()FragmentClass.this不起作用,我该怎么办?

数据库构造函数

public Database(Context ctx)
{
this.context = ctx;
DBHelper = new DatabaseHelper(context);
}
615865 次浏览

您可以使用getActivity(),它返回与fragment关联的活动。
活动是context(由于#EYZ1扩展Context

要按照上面的答案进行操作,您可以重写onAttach方法:

public static class DummySectionFragment extends Fragment{
...
@Override
public void onAttach(Activity activity) {
super.onAttach(activity);
DBHelper = new DatabaseHelper(activity);
}
}

获取我找到的片段上下文的最简单和最精确的方法是在调用onCreateView方法时直接从ViewGroup中获取它至少在这里你确定不会为getActivity()获取null:

public class Animal extends Fragment {
Context thiscontext;
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState)
{
thiscontext = container.getContext();

始终使用getActivity()获取活动方法来获取附加活动的上下文,但始终记住一件事:Fragments有点不稳定,getActivity有时会返回null,因此,在通过getActivity()获取上下文之前,请始终检查是否新增方法。

另一种替代方法是:

您可以使用以下命令获取上下文:

getActivity().getApplicationContext();
@Override
public void onAttach(Activity activity) {
// TODO Auto-generated method stub
super.onAttach(activity);
context=activity;
}

getActivity()是Context的孩子,所以应该适合你

使用#E YZ 0可以获取片段中的上下文:

public Database()
{
this.context = getActivity();
DBHelper = new DatabaseHelper(this.context);
}
  • 小心,要使用getActivity()获取与片段关联的Activity,您可以使用它,但不建议它会导致内存泄漏。

我认为一个更好的方法必须从onAttach()方法中获取Activity

@Override
public void onAttach(Activity activity) {
super.onAttach(activity);
context = activity;
}

简单的方法是使用getActivity()。但我认为使用getActivity()方法获取上下文的主要混淆是空指针异常。

为此,首先检查isAdded()方法,该方法将确定是否添加它,然后我们可以使用getActivity()来获取活动的上下文。

getContext()在API 23中出现。将其替换为代码中的每个位置的getActivity()。

看看它是否修复了错误。尝试使用介于目标和最小API级别之间的方法,否则会出现此错误。

当重写onCreateView时,您还可以从inflater参数获取上下文。

public static class MyFragment extends Fragment {
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) {
/* ... */
Context context = inflater.getContext();
/* ... */
}
}

理想情况下,您不需要使用全局变量。片段有不同的通知,其中一个是onActivityCreated。您可以在片段的此生命周期事件中获取活动的实例。

然后:您可以取消引用该片段以根据需要获取活动、上下文或应用程序上下文:

this.getActivity()将为您提供活动的句柄 this.getContext()将为您提供上下文句柄 this.getActivity().getApplicationContext()将为您提供应用程序上下文的句柄。您最好在将应用程序上下文传递给数据库时使用它。

您可以拨打getActivity()或,

public void onAttach(Context context) {
super.onAttach(context);
this.activity = (CashActivity) context;
this.money = this.activity.money;
}

从API级别23开始,有getContext(),但如果您想支持旧版本,您可以使用getActivity().getApplicationContext(),而我仍然建议使用Fragment的支持版本android.support.v4.app.Fragment

你有不同的选择:

  • 如果minSDK<=21,则可以使用getActivity(),因为这是一个Context
  • 如果您的minSDK>=23,则可以使用getContext()

如果您不需要支持旧版本,请使用getContext()

使用支持库中的片段-

android.support.v4.app.Fragment

然后覆盖

void onAttach (Context context) {
this.context = context;
}

通过这种方式,您可以确保上下文始终为非空值。

对于静态编程语言,您可以直接在片段中使用context。但是在某些案例中,您会发现如下错误

类型不匹配:推断的类型是Context?但Context是预期的

因为你能做到这一点

val ctx = context ?: return
textViewABC.setTextColor(ContextCompat.getColor(ctx, android.R.color.black))

我想你可以用

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;
}
}

我需要使用arrayAdapter IN片段的上下文,当我使用获取活动时发生错误,但当我用getContext替换它时,它对我有用

listView LV=getView().findViewById(R.id.listOFsensors);
LV.setAdapter(new ArrayAdapter<String>(getContext(),android.R.layout.simple_list_item_1 ,listSensorType));

以前我使用onAttach (Activity activity)Fragment中获取context

问题

#E YZ 0方法在API级别23中已弃用。

解决方案

现在要在Fragment中获取上下文,我们可以使用#E YZ 1

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()Fragments中获取context 但是getActivity()可以返回null,如果你的fragment当前没有附加到父activity

在你的碎片上

((Name_of_your_Activity) getActivity()).helper

关于活动

DbHelper helper = new DbHelper(this);

kotlin中,只需使用activity而不是getActivity()

您可以使用getActivity()方法获取上下文或 您可以使用getContext()方法。

View root = inflater.inflate(R.layout.fragment_slideshow, container, false);
Context c = root.getContext();

希望有帮助!

Kotlin样本的内部碎片可以帮助某人

textViewStatus.setTextColor(ContextCompat.getColor(context!!, R.color.red))

如果您使用数据绑定;

bindingView.textViewStatus.setTextColor(ContextCompat.getColor(context!!, R.color.red))

其中bindingView在创建视图中初始化,如下所示

private lateinit var bindingView: FragmentBookingHistoryDetailBinding


bindingView = DataBindingUtil.inflate(inflater, R.layout.your_layout_xml, container, false)

正确的方法是使用

requireContext()

和示例

ContextCompat.getColor(requireContext(), R.color.colorAccent),

要求上下文()方法是最简单的选项

requireContext()

示例

MyDatabase(requireContext())

在片段中获取上下文的安全方法

if(isAdded){
requireActivit();//this is your context
}

您可以使用getActivity(),它返回与片段关联的活动。 活动是一个上下文(因为活动扩展了上下文)。

注意:如果getActivity()在相应片段的onAttach之前调用,它可以返回null。

2.or

获取我找到的片段上下文的最简单和最精确的方法是在调用onCreateView方法时直接从ViewGroup获取它,至少在这里你可以确保getActivity()不会为null:

public class Animal extends Fragment {
Context thiscontext;
@Override
public View onCreateView(LayoutInflater inflater,
ViewGroup container, Bundle savedInstanceState)
{
thiscontext = container.getContext();
//...
//...
//...
}

androidx.fragment.app.碎片

@NonNull
public final android.content.Context requireContext()

返回片段当前关联的上下文。

因为: getActivity和Context都可以为空,最好的做法是使用需要的Context(),因为它不能为空。

在静态编程语言中,您可以使用: 需要活动()。应用程序上下文