片段无法转换为上下文

Posted

技术标签:

【中文标题】片段无法转换为上下文【英文标题】:Fragment cannot be converted to Context 【发布时间】:2015-11-05 03:11:18 【问题描述】:

这是我第一次使用片段(android 开发新手),我正在尝试设置一个微调器。目前我对上下文很困惑,似乎无法解决这个错误:

Error:(52, 78) error: incompatible types: HotkeysFragment cannot be converted to Context

这是它引用的代码:

HotkeysFragment.java

@Override
public void onCreate(Bundle savedInstanceState) 
    super.onCreate(savedInstanceState);
    if (getArguments() != null) 
        mParam1 = getArguments().getString(ARG_PARAM1);
        mParam2 = getArguments().getString(ARG_PARAM2);
    

    Spinner hotkey_selector_spinner = (Spinner) rootView.findViewById(R.id.hotkey_selector_spinner);

    ArrayAdapter<CharSequence> adapter = ArrayAdapter.createFromResource(this,
            R.array.hotkey_options, android.R.layout.simple_spinner_item);
    adapter.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item);
    hotkey_selector_spinner.setAdapter(adapter);


@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
                         Bundle savedInstanceState) 
    final View rootViewB = inflater.inflate(R.layout.fragment_hotkeys, container, false);
    rootView = rootViewB;
    return rootViewB;

具体行是:

ArrayAdapter<CharSequence> adapter = ArrayAdapter.createFromResource(this,
            R.array.hotkey_options, android.R.layout.simple_spinner_item);

进口:

import android.app.Activity; 
import android.net.Uri;
import android.os.Bundle;
import android.app.Fragment;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.ArrayAdapter;
import android.widget.Spinner;
import java.util.zip.Inflater;

我该如何解决这个问题?

【问题讨论】:

this 更改为 getActivity() 如果是Fragment,为什么onCreate中的代码?查看片段生命周期并获取片段中的上下文使用getActivity()hotkey_selector_spinner 将为 null 导致 NPE 那么如果它不应该在onCreate中,那么它应该在onCreateView中吗?目前应用程序崩溃,这是为什么? @mtmeyer 我建议查看片段文档,尤其是生命周期部分 @Raghunandan 因此,在阅读了生命周期之后,似乎使用onActivityCreated 会更好。这是正确的吗? 【参考方案1】:

改变

ArrayAdapter<CharSequence> adapter = ArrayAdapter.createFromResource(this,
        R.array.hotkey_options, android.R.layout.simple_spinner_item);

ArrayAdapter<CharSequence> adapter = ArrayAdapter.createFromResource(getActivity(),
        R.array.hotkey_options, android.R.layout.simple_spinner_item);

使用getActivity()访问片段中的上下文

【讨论】:

@Holmes 这是给 ?? 的消息?【参考方案2】:

Fragment不能转换成ContextActivity可以。

所以你应该改变

ArrayAdapter<CharSequence> adapter = ArrayAdapter.createFromResource(this,
        R.array.hotkey_options, android.R.layout.simple_spinner_item);

ArrayAdapter<CharSequence> adapter = ArrayAdapter.createFromResource(getActivity(),
        R.array.hotkey_options, android.R.layout.simple_spinner_item);

【讨论】:

【参考方案3】:

在任何Fragment 中访问context 的正确方法是使用getActivity() 方法。

您也可以直接从onCreateView 内的ViewGroup 获取。如果您采用这种方式,您将无法获得 null,因为您可以从 getActivity() 获得(只要您在之前为用户界面视图实例化它)。

fragment_context = container.getContext();

【讨论】:

container 可以为空。它在the documentation 中声明了这一点 它只会返回null,如果它没有为用户界面视图实例化,这是没有意义的,因为你正在使用它。 你是对的。大多数时候你永远不会看到这个方法在没有容器的情况下执行。 The docs 表示片段“可能仍会从其保存状态创建”,并带有 null container。我知道这是一个极端情况,但它仍然可能发生,使代码变得不必要地脆弱。你永远不知道将来你可能需要如何使用这个片段;分片系统漏洞百出,无需多曝光。【参考方案4】:

来自here 的 Fragments 上的 Android 文档:

注意:如果您需要在 Fragment 中使用 Context 对象,您可以 调用 getActivity()。但是,请注意仅调用 getActivity() 当片段附加到活动时。当片段不是 尚未连接,或在其生命周期结束时分离, getActivity() 将返回 null。

所以,除了将this改为getActivity(),我还建议你在onActivityCreated()中使用getActivity()(因为你还需要先膨胀视图)

@Override
public void onActivityCreated(Bundle savedInstanceState) 
    super.onActivityCreated(savedInstanceState);
    if (getArguments() != null) 
        mParam1 = getArguments().getString(ARG_PARAM1);
        mParam2 = getArguments().getString(ARG_PARAM2);
    

    Spinner hotkey_selector_spinner = (Spinner) getView().findViewById(R.id.hotkey_selector_spinner);

    ArrayAdapter<CharSequence> adapter = ArrayAdapter.createFromResource(getActivity(),
            R.array.hotkey_options, android.R.layout.simple_spinner_item);
    adapter.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item);
    hotkey_selector_spinner.setAdapter(adapter);

【讨论】:

我仍然得到这个:java.lang.NullPointerException: Attempt to invoke virtual method 'android.view.View android.view.View.findViewById(int)' on a null object reference 我认为这意味着它仍然返回 null 我编辑了我的答案以考虑到您在创建适配器时还需要​​膨胀视图

以上是关于片段无法转换为上下文的主要内容,如果未能解决你的问题,请参考以下文章

如何在选项卡片段内调用gridView适配器

在创建VSCode片段时,如何将变量转换为title-case(如TitleCase)?

无法转换为上下文 [重复]

访问片段的上下文 [重复]

无法将类型“IQueryable”隐式转换为 Generic.IList' 从 EF 上下文中检索记录列表作为列表

Android - 上下文 - Google Maps V2 - 类型不匹配:无法从 Object 转换为 WindowManager