我的应用中有一个ViewPager,目前有6个片段。我已经适当地设置了屏幕外限制,直到现在还没有出现问题。在有问题的片段中,有一个ListView,它包含所有传感器的名称和供应商。当我尝试将所有这些信息检索到String时,我的应用程序崩溃了。罪魁祸首就是这一行
SensorManager sensorManager = (SensorManager) getActivity().getSystemService(Context.SENSOR_SERVICE);
这是在onActivityCreated上初始化的,并且除了在尝试获取文本和字符串时效果很好,它为空。
public String retrieveContent() {
String content = "";
if (sensorItems == null) {
SensorManager sensorManager = (SensorManager) getActivity().getSystemService(Context.SENSOR_SERVICE);
List<Sensor> deviceSensors = sensorManager.getSensorList(Sensor.TYPE_ALL);
sensorItems = new ArrayList<>();
for (int i = 0; i < deviceSensors.size(); i++) {
SensorListModel sensorListModel = new SensorListModel();
sensorListModel.name = deviceSensors.get(i).getName();
sensorListModel.vendor = deviceSensors.get(i).getVendor();
sensorItems.add(sensorListModel);
}
}
for (int i = 0; i < sensorItems.size(); i++) {
content = content + sensorItems.get(i).retrieveContent();
}
return content;
}
和我非常简单的模型,如果你需要看到它。
public class SensorListModel {
TextView tvName;
TextView tvVendor;
public String name;
public String vendor;
public String retrieveContent() {
return tvName.getText() + "\n"
+ tvVendor.getText() + "\n\n";
}
}
一切正常,数据显示在listview中。在调用retrieveContent
方法
答案 0 :(得分:2)
如果它不在屏幕上,则其视图将被销毁(onDestroyView()
),并且它将与Activity
(onDetach()
)分离。这意味着当您致电getActivity()
时,结果将为空,因为它不再附加到Activity
。
只需在SensorManager
中保留对onAttach()
的引用:
private SensorManager mSensorManager;
public void onAttach(Activity activity) {
super.onAttach(activity);
mSensorManager = (SensorManager) activity.getSystemService(Context.SENSOR_SERVICE);
}
答案 1 :(得分:0)
好吧,它与Context
有关,所以我在我的MainActivity中添加了retrieveContent()
方法,在用户需要时保存了Fragments。不再从Fragment中检索它(即使它在我调用此方法之前创建,导致NPE),并从主活动调用。