尝试调用虚拟方法 'java.lang.Object android.content.Context.getSystemService(java.lang.String)

问题描述 投票:0回答:4

我想问,为什么我的代码在设备上运行时不起作用,但是当我像 Genymotion 这样的模拟器 android 上运行时,它运行得很好..

有人在这个link上这样说:除非在某些情况下,否则在 super.onCreate() 之后才能调用 Activity 超类上的方法。请推迟对提示视图的初始化,直到调用 super.onCreate() 后。

我还是不明白,如果你有同样的问题请告诉我..

无论如何,如果我的解释不好,我很抱歉..

public class DestinationListAdapter extends ArrayAdapter<DestinationModel> {

    Context context;
    int layoutResourceId;
    List<DestinationModel> data = Collections.emptyList();

    public DestinationListAdapter(Context context, int layoutResourceId, List<DestinationModel> data) {
        super(context, layoutResourceId, data);
        this.layoutResourceId = layoutResourceId;
        this.context = context;
        this.data = data;
    }

    @Override
    public View getView(int position, View convertView, ViewGroup parent) {

        View row = convertView;
        DestinationHolder holder = null;

        if(row == null)
        {
            // Predicted Error At Line Below
            LayoutInflater inflater = ((Activity)context).getLayoutInflater();
            row = inflater.inflate(layoutResourceId, parent, false);

            holder = new DestinationHolder();
            holder.destination_id = (TextView) row.findViewById(R.id.destination_id);
            holder.destination_name = (TextView) row.findViewById(R.id.destination_name);

            row.setTag(holder);
        }
        else
        {
            holder = (DestinationHolder)row.getTag();
        }

        DestinationModel weather = data.get(position);
        holder.destination_id.setText(weather.getDestination_id());
        holder.destination_name.setText(weather.getDestination_name());

        return row;
    }
java android
4个回答
46
投票

确保返回并继续之前的活动 我刚刚添加并检查 getContext()!=null

这是一个很好的例子:

区块之前

adapter = new ExampleAdapter(getContext());
adapter.setData(items);
listView.setAdapter(adapter);

并且更好地替换 getActivity()!=null

例如:

if (getActivity()!=null){
    adapter = new ExampleAdapter(getActivity());
    adapter.setData(items);
    listView.setAdapter(adapter);
}

我认为这解决了所有与我的问题有相同错误的问题!


4
投票

意识到您处于生命周期的哪个阶段。

getContext()
的值可能尚不可用。

例如,在

DialogFragment
中,在调用
onCreateDialog()
之前上下文将不可用。因此,不要尝试在构造函数中创建适配器,因为此时上下文仍为空。


0
投票

实际上,当某些内容为空字节时,就会出现此问题。 当我们使用回收器视图时,它就出现了。因为大多数人混淆在RecyclerViewAdpater的onCreateView中。 一些代码编写者将 Layout inflater 编写为 Tab 的布局。但在这里我们将使用另一种布局,其中我们将提到我们的内部 Recyclerview 布局。

view= LayoutInflater.from(mcontext).inflate(R.layout.**item_tab14**,parent,false);

0
投票

您应该了解生命周期以及何时可以使用上下文。

我在 kotlin 中遇到了同样的问题。我遇到的情况是实例化一个需要的

AudioManager
。所以我尝试接管类型为 AudioManager 的 Activity。
context

要解决标题问题,您必须在创建活动后使用
private val audioManager = getSystemService(context, AudioManager::class.java)

。就我而言,我只使用

context
所以我更改了
MainActivity
 中启动 audioManager 实例的时间

MainActivity.kt

onCreate()

希望帮助遇到同样问题的人,特别是使用 kotlin 解决!! (当然 Java 用户也是如此)

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