片段无法转换为Context

时间:2015-08-12 13:17:50

标签: java android xml android-fragments

这是我第一次使用片段(android dev的新手),我试图设置一个微调器。目前我对上下文非常困惑,似乎无法解决这个错误:

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;

我该如何解决这个问题?

4 个答案:

答案 0 :(得分:8)

来自here的片段中的Android文档:

  

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

因此,除了将this更改为getActivity()之外,我还建议您使用getActivity()中的onActivityCreated()(因为您还需要先查看视图)

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

答案 1 :(得分:3)

更改

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

访问片段中的上下文

答案 2 :(得分:1)

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 :(得分:1)

context内访问Fragment的正确方法是使用getActivity()方法。

您也可以直接从ViewGroup onCreateView内部获取。如果你这样做,你就不会得到null getActivity(),只要你在之前为用户界面视图实例化它就会得到)。

fragment_context = container.getContext();