GetSystemServices undefined при вызове в фрагменте?
Я хочу, чтобы TextViews
отображал показания датчиков в Fragment
. При попытке инициализации SensorManager
getSystemServices
есть undefined в Fragment
, говорит eclipse. Почему и как его исправить.
Фрагмент
public class FragSensors extends Fragment {
private TextView accXTv, accYTv, accZTv;
private SensorManager sensorManager;
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) {
// TODO Auto-generated method stub
View v = inflater.inflate(R.layout.frag_sensors, container, false);
accXTv = (TextView) v.findViewById(R.id.accXValue);
accYTv = (TextView) v.findViewById(R.id.accYValue);
accZTv = (TextView) v.findViewById(R.id.accZValue);
return v;
}
@Override
public void onActivityCreated(Bundle savedInstanceState) {
// TODO Auto-generated method stub
super.onActivityCreated(savedInstanceState);
sensorManager = (SensorManager) getSystemService(Context.SENSOR_SERVICE);
}
private final SensorEventListener mSensorListener = new SensorEventListener() {
@Override
public void onSensorChanged(SensorEvent arg0) {
// TODO Auto-generated method stub
}
@Override
public void onAccuracyChanged(Sensor arg0, int arg1) {
// TODO Auto-generated method stub
}
};
}
Ответы
Ответ 1
Еще один вызов метода:
sensorManager = (SensorManager) getActivity().getSystemService(Context.SENSOR_SERVICE);
Почему этот дополнительный вызов вызывается?
метод getSystemService()
, обеспечивающий доступ к системным службам, поступает из Context
. Activity
продолжается Context
, a Fragment
- нет. Следовательно, сначала вам нужно получить ссылку на Activity
, в которой содержится Fragment
, а затем магически получить требуемую системную услугу.
Ответ 2
Использование:
getActivity().getSystemService(name)
Ответ 3
sensorManager = (SensorManager) getActivity().getSystemService(Context.NAMEOF_SERVICE);
Фрагменты не могут напрямую обращаться к системным службам, вы должны использовать Activity, с которым прикреплен этот фрагмент
Ответ 4
На Kotlin использовать:
this.sensorManager = activity!!.getSystemService(Context.SENSOR_SERVICE) as SensorManager
Ответ 5
Вы также можете получить контекст из LayoutInflater.
SensorManager sm = (SensorManager) getLayoutInflater().getContext().getSystemService(Context.SENSOR_SERVICE);