在片段中声明findViewById之后的java.lang.NullpointerException

时间:2017-01-27 22:16:11

标签: java android android-fragments android-preferences

我尝试使用var heatmap; var xmlhttp = new XMLHttpRequest(); xmlhttp.onreadystatechange = function() { if (this.readyState == 4 && this.status == 200) { var heatmapData = []; myObj = JSON.parse(this.responseText); for (var i = 0; i < myObj.points.length; i++) { var latLng = new google.maps.LatLng(myObj.points[i].lat, myObj.points[i].lng); var pushData = { location: latLng, weight: myObj.points[i].weight } heatmapData.push(pushData); } heatmap = new google.maps.visualization.HeatmapLayer({ data: heatmapData, maxIntensity: 10, radius: 30, opacity: 0.4, map: map }) } }; ,但随后会出现警告。我已经看到了用于解决此警告的几种不同方法,但我不知道哪些方法适用于我的代码。有谁知道在这种情况下删除此警告的正确方法是什么?

  

方法调用&#39; findViewById&#39;可能会产生&#39; java.lang.NullpointerException&#39;

Page1Fragment.java

findViewById

2 个答案:

答案 0 :(得分:0)

我假设你在谈论一个棉绒警告。

根据片段所处的生命周期的哪个部分,它可能已经或者可能没有调用其onCreateView方法。

如果尚未创建片段视图(尚未调用onCreateView),则对getView()的调用将返回null。

因此,你需要像这样检查null:

View contentView = getView();
if (contentView != null) {
    contentView.findViewById(R.id.blue_square).setVisibility(View.VISIBLE);
}

要知道片段何时附加到活动并且其视图已创建,并不总是很容易。例如,如果您已启动AsyncTask以在后台线程上检索某些数据然后再更新UI,则用户可能已从您的片段导航,并且在这种情况下getView()将返回null。

有关详细说明片段生命周期的更多信息,请查看developer.android.com上Fragment的文档。

答案 1 :(得分:0)

如果您知道在哪里调用getView()方法,(在onCreateView之后和onDestroyView之前),您可以忽略这些警告。 此方法将在这两个回调之外返回null

避免一遍又一遍地检查它的一种简洁方法是将rootView作为dislplaySettings方法的参考传递。

public void displaySettings(View rootView) {
    if (squareState) {
        rootView.findViewById(R.id.blue_square).setVisibility(View.VISIBLE);
    } else {
        rootView.findViewById(R.id.blue_square).setVisibility(View.GONE);
    }
}

当您在onResume内使用时,您将不会抱怨如下:

@Override
public void onResume() {
    displaySettings(getView()); // You're safe here!
}

请参阅片段生命周期docs

<强>加成

避免一些代码重复

public void displaySettings(View rootView) {
    rootView.findViewById(R.id.blue_square).setVisibility(squareState ? View.VISIBLE : View.GONE);
}