在片段中使用上下文

问题描述 投票:613回答:26

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

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

数据库构造函数

public Database(Context ctx)
{
    this.context = ctx;
    DBHelper = new DatabaseHelper(context);
}
java android android-fragments android-context
26个回答
1241
投票

你可以使用getActivity(),它返回与fragment相关的活动。 活动是context(因为Activity扩展Context)。


3
投票

fragment来自API 23.在代码中的任何地方用getActivity()替换它。

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


3
投票

由于API级别23有activity但是如果你想支持旧版本,你可以使用getContext(),而我仍然建议使用getContext()的支持版本getActivity().getApplicationContext()


2
投票

Fragment是Context的孩子,所以应该适合你


2
投票

使用支持库中的片段 -

android.support.v4.app.Fragment

然后覆盖

getActivity()

这样,您可以确保上下文始终为非null值。


2
投票

你有不同的选择:

  • 如果你的minSDK <= 21,那么你可以使用android.support.v4.app.Fragment ,因为这是一个void onAttach (Context context) { this.context = context; }
  • 如果您的minSDK> = 23,那么您可以使用getActivity()

如果您不需要支持旧版本,请使用Context


2
投票

对于Kotlin,您可以直接在片段中使用getContext()。但在某些情况下你会发现一个错误

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

为此你可以做到这一点

getContext()

1
投票

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

然后:您可以根据需要取消引用片段以获取活动,上下文或applicationcontext:

context将为您提供活动的句柄val ctx = context ?: return textViewABC.setTextColor(ContextCompat.getColor(ctx, android.R.color.black)) 将为您提供上下文的句柄this.getActivity()将为您提供应用程序上下文的句柄。最好在将应用程序上下文传递给db时使用它。


1
投票

简单的方法是使用this.getContext()。但我认为使用this.getActivity().getApplicationContext()方法获取上下文的主要困惑是空指针异常。

为此,首先使用getActivity()方法检查是否已添加,然后我们可以使用getActivity()来获取Activity的上下文。


1
投票

你可以打电话给isAdded()或者,

getActivity()

1
投票

在kotlin只需使用getActivity()而不是public void onAttach(Context context) { super.onAttach(context); this.activity = (CashActivity) context; this.money = this.activity.money; }


127
投票

要做到上面的答案,你可以覆盖片段的onAttach方法:

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

0
投票

getContext()方法有助于在片段活动中使用类的Context。


0
投票

我想你可以用

activity

0
投票
getActivity()

0
投票

你也可以使用:

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();

0
投票

我需要使用arrayAdapter IN片段的上下文,当我使用getActivity时出现错误但是当我用getContext替换它时它适用于我

getActivity()

0
投票

You can use 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

Pro tip

始终检查/** * 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。


0
投票

在你片段

 /**
     * 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)

24
投票

始终使用getActivity()方法获取附加活动的上下文,但始终记住一件事:片段稍微不稳定,getActivity有时会返回null,所以为此,在获取isAdded()的上下文之前,请始终检查片段的getActivity()方法。


19
投票

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

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

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

5
投票

使用getActivity()可以获得Fragment中的上下文:

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

我认为更好的方法必须是从qazxsw poi方法获得qazxsw poi:

Activity

4
投票

当覆盖onAttach()时,您还可以从@Override public void onAttach(Activity activity) { super.onAttach(activity); context = activity; } 参数获取上下文。

inflater

4
投票

另一种替代方法是:

您可以使用以下方式获取上下文

onCreateView

4
投票

以前我用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

文档

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

© www.soinside.com 2019 - 2024. All rights reserved.