在片段中使用上下文

时间:2011-11-21 16:46:29

标签: java android android-fragments android-context

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

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

数据库构造函数

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

31 个答案:

答案 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)

您有不同的选择:

  • 如果您的minSDK <= 21,那么您可以使用getActivity(),因为这是Context
  • 如果您的minSDK>&gt; = 23,则可以使用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)。