当我运行以下代码时,它崩溃并引发NPE错误。
我尝试访问一个对象,在本例中为片段活动中的textview
。我应该怎么做?
下面是我从片段活动中粘贴的代码。
另一个问题是如何在片段活动中使用findViewById
。
public class Report extends Fragment implements SensorEventListener {
private static final double NOISE = 2.0 ;
//define
private SensorManager sensorManager;
private Sensor accelerometer;
private boolean mInitialized;
private static final String TAG = "Report";
private TextView Counter;
double X,Y,Z;
double lastX, lastY, lastZ;
double deltaX, deltaY, deltaZ;
int stepsCount;
private int threshold; // point at which we want to trigger a step.
@Nullable
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
View view = inflater.inflate(R.layout.report, container, false);
Counter = getActivity().findViewById(R.id.counter);
threshold = 10;
//initialize the variables
mInitialized = false;
//get the sensor manager
sensorManager = (SensorManager)getActivity().getSystemService(getActivity().SENSOR_SERVICE);
//get accelerometer sensor.
accelerometer = sensorManager.getDefaultSensor(Sensor.TYPE_ACCELEROMETER);
startSensor();
return view;
}
private void startSensor() {
//register a listener
sensorManager.registerListener(Report.this, accelerometer ,SensorManager.SENSOR_DELAY_NORMAL);
}
@Override
public void onSensorChanged(SensorEvent sensorEvent) {
// Log.d (TAG, "onSensorChanged: X:" + sensorEvent.values[0] + "Y:" + sensorEvent.values[1] + "Z:" + sensorEvent.values[2]);
// alpha is calculated as t / (t + dT)
// with t, the low-pass filter's time-constant
// and dT, the event delivery rate
final double alpha = 0.8; // constant for our filter below
double[] gravity = {0, 0, 0};
// Isolate the force of gravity with the low-pass filter.
gravity[0] = alpha * gravity[0] + (1 - alpha) * sensorEvent.values[0];
gravity[1] = alpha * gravity[1] + (1 - alpha) * sensorEvent.values[1];
gravity[2] = alpha * gravity[2] + (1 - alpha) * sensorEvent.values[2];
// Log.d(TAG,"GRAVITY: X:" + gravity[0] + "Y:" + gravity[1] + "Z:" + gravity[2] );
// Remove the gravity contribution with the high-pass filter.
X = sensorEvent.values[0] - gravity[0];
Y = sensorEvent.values[1] - gravity[1];
Z = sensorEvent.values[2] - gravity[2];
//Log.d(TAG,"X:" + X + "Y:" + Y + "Z:" + Z);
lastX = 0;
lastY = 0;
lastZ = 0;
if (!mInitialized) {
//sensor is used for the first time, initialize the last read values
lastX = X;
lastY = Y;
lastZ = Z;
mInitialized = true;
} else {
// sensor is already initialized, and we have previously read values.
// take difference of past and current values and decide which
// axis acceleration was detected by comparing values
deltaX = Math.abs(lastX - X);
deltaY = Math.abs(lastY - Y);
deltaZ = Math.abs(lastZ - Z);
// Log.d(TAG,"X:"+ deltaX + "Y:" + deltaY + "Z:" + deltaZ);
if (deltaX < NOISE)
deltaX = (float) 0.0;
if (deltaY < NOISE)
deltaY = (float) 0.0;
if (deltaZ < NOISE)
deltaZ = (float) 0.0;
lastX = X;
lastY = Y;
lastZ = Z;
if (deltaX > deltaY) {
// Horizontal shake
// do something here if you like
} else if (deltaY > deltaX) {
// Vertical shake
// do something here if you like
} else if (deltaZ>threshold){
stepsCount++;
Log.d(TAG,"STEPS:" + stepsCount);
}
Counter.setText(String.valueOf(stepsCount));//this is the line that throws the error
}
}
@Override
public void onResume(){
super.onResume();
stepsCount=0;
// put your code here...
}
@Override
public void onPause(){
super.onPause();
sensorManager.unregisterListener(this);
// put your code here...
}
@Override
public void onAccuracyChanged(Sensor sensor, int i) {
}
}
答案 0 :(得分:0)
onCreateView()
中的这一行:
Counter = getActivity().findViewById(R.id.counter);
需要是:
Counter = view.findViewById(R.id.counter);
当您从布局中获取TextView
时,您在一行中而不是Activity上增加了一行。附带说明一下,您不应该在变量前面加一个大写字母。只有课程应该以大写字母开头。