Я сделал проект андроида, который запустит датчик акселерометра и сохранит данные датчика x, y, z в файле. Я добавил строку кода start.setEnabled(false)
и stop.setEnabled(true)
по методу start
, и мой код разбился на start
с тех пор. Ошибка заключается в следующем: Ошибка в коде: java.lang.IllegalStateException: Не удалось выполнить метод для android: onClick
E/AndroidRuntime: FATAL EXCEPTION: main
Process: com.example.zhenga1.photojewel, PID: 27298
java.lang.IllegalStateException: Could not execute method for android:onClick
at android.view.View$DeclaredOnClickListener.onClick(View.java:4507)
at android.view.View.performClick(View.java:5267)
at android.view.View$PerformClick.run(View.java:21540)
at android.os.Handler.handleCallback(Handler.java:815)
at android.os.Handler.dispatchMessage(Handler.java:104)
at android.os.Looper.loop(Looper.java:207)
at android.app.ActivityThread.main(ActivityThread.java:5710)
at java.lang.reflect.Method.invoke(Native Method)
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:900)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:761)
Caused by: java.lang.reflect.InvocationTargetException
at java.lang.reflect.Method.invoke(Native Method)
at android.view.View$DeclaredOnClickListener.onClick(View.java:4502)
at android.view.View.performClick(View.java:5267)
at android.view.View$PerformClick.run(View.java:21540)
at android.os.Handler.handleCallback(Handler.java:815)
at android.os.Handler.dispatchMessage(Handler.java:104)
at android.os.Looper.loop(Looper.java:207)
at android.app.ActivityThread.main(ActivityThread.java:5710)
at java.lang.reflect.Method.invoke(Native Method)
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:900)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:761)
Caused by: java.lang.NullPointerException: Attempt to invoke virtual method 'void android.widget.Button.setEnabled(boolean)' on a null object reference
at com.example.zhenga1.photojewel.Main3Activity.start(Main3Activity.java:120)
at java.lang.reflect.Method.invoke(Native Method)
at android.view.View$DeclaredOnClickListener.onClick(View.java:4502)
at android.view.View.performClick(View.java:5267)
at android.view.View$PerformClick.run(View.java:21540)
at android.os.Handler.handleCallback(Handler.java:815)
at android.os.Handler.dispatchMessage(Handler.java:104)
at android.os.Looper.loop(Looper.java:207)
at android.app.ActivityThread.main(ActivityThread.java:5710)
at java.lang.reflect.Method.invoke(Native Method)
Update: Вот мой .xml основной файл макета:
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:paddingBottom="16dp"
android:paddingLeft="16dp"
android:paddingRight="16dp"
android:paddingTop="16dp"
tools:context="com.example.zhenga1.photojewel.MainActivity">
<Button
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="Start Accelerometer"
android:id="@+id/button"
android:onClick="start"
android:layout_marginTop="300dp"
android:layout_marginStart="0dp"
android:layout_marginLeft="0dp"
android:textStyle="normal"
android:textSize="6pt"/>
<Button
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="End Accelerometer"
android:onClick="end"
android:id="@+id/button2"
android:layout_alignParentRight="true"
android:layout_marginTop="300dp"
android:textStyle="normal"
android:textSize="6pt"/>
<ImageView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:id="@+id/imageView2"
android:layout_marginTop="200dp"
android:layout_marginLeft="150dp"
android:src="@mipmap/vibrator_pic"/>
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:textAppearance="?android:attr/textAppearanceMedium"
android:text="Medium Text"
android:id="@+id/textView"
android:layout_alignParentBottom="true"
android:layout_marginTop="600dp"
android:layout_marginLeft="0dp"
android:layout_marginStart="0dp"/>
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:textAppearance="?android:attr/textAppearanceMedium"
android:text="Medium Text"
android:id="@+id/textView2"
android:layout_alignParentBottom="true"
android:layout_centerHorizontal="true"/>
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:textAppearance="?android:attr/textAppearanceMedium"
android:text="Medium Text"
android:id="@+id/textView3"
android:layout_alignParentBottom="true"
android:layout_marginTop="600dp"
android:layout_alignParentRight="true"/>
<ImageButton
android:layout_width="30dp"
android:layout_height="30dp"
android:id="@+id/imageButton2"
android:layout_alignParentLeft="true"
android:onClick="back"
android:layout_alignParentTop="true"
android:src="@mipmap/back_button"/>
</RelativeLayout>
А вот мой Java-код:
package com.example.zhenga1.photojewel;
import android.app.Activity;
import android.content.Context;
import android.hardware.Sensor;
import android.hardware.SensorEvent;
import java.lang.Boolean;
import java.io.File;
import android.hardware.SensorEventListener;
import android.hardware.SensorManager;
import android.os.Bundle;
import android.os.SystemClock;
import android.view.View;
import android.widget.Toast;
import android.widget.Button;
import android.widget.TextView;
import java.util.TimerTask;
import java.util.Timer;
import java.io.FileWriter;
import java.io.IOException;
import java.util.Arrays;
public class Main3Activity extends Activity implements SensorEventListener{
private Sensor Accel;
static private SensorManager Sensor;
public float[] linear_acceleration;
private float maxdeltax, maxdeltay, maxdeltaz;
public float[] gravity;
private Boolean bool = Boolean.TRUE;
public float[] prevvalue;
private float deltax, deltay, deltaz;
private FileWriter prnt;
private Timer timer;
private TimerTask timerTask;
private File fold, file;
private Button start, stop;
private TextView curx,cury,curz;
private int count, curd;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main3);
count = 0;
initializetimer();
System.out.println("This is the clock time in Mills"+SystemClock.uptimeMillis());
linear_acceleration = new float[3];
start = (Button)findViewById(R.id.button1);
stop = (Button)findViewById(R.id.button2);
maxdeltax = 0f;
maxdeltay = 0f;
maxdeltaz = 0f;
gravity = new float[3];
fold = new File("sdcard/vibration");
if(!fold.exists()) {
fold.mkdir();
}
file = new File("sdcard/vibration/data.txt");
int v=0;
if(!file.exists())
{
try {
file.createNewFile();
} catch (IOException e) {
e.printStackTrace();
}
curd = 0;
}
else {
while (file.exists()) {
v++;
file = new File("sdcard/vibration/data" + v + ".txt");
curd = v;
}
int d = v-1;
file = new File("sdcard/vibration/data"+d+".txt");
if(file.length()>300)
{
file = new File("sdcard/vibration/data"+d+".txt");
curd = d;
}
try {
file.createNewFile();
} catch (IOException e) {
e.printStackTrace();
}
}
prevvalue = new float[3];
Arrays.fill(prevvalue,0);
Sensor = (SensorManager) getSystemService(Context.SENSOR_SERVICE);
Accel = Sensor.getDefaultSensor(android.hardware.Sensor.TYPE_ACCELEROMETER);
curx = (TextView)findViewById(R.id.textView);
cury = (TextView)findViewById(R.id.textView2);
curz = (TextView)findViewById(R.id.textView3);
displayCurrentValues(0,0,0);
try {
prnt = new FileWriter(file, Boolean.TRUE);
} catch (IOException e) {
e.printStackTrace();
}
}
private void initializetimer()
{
timerTask = new TimerTask() {
@Override
public void run() {
saveCurVals(maxdeltax,maxdeltay,maxdeltaz);
maxdeltax = 0f;
maxdeltay = 0f;
maxdeltaz = 0f;
}
};
}
public void start(View view)
{
stop.setEnabled(true);
Sensor.registerListener(this, Accel, SensorManager.SENSOR_DELAY_NORMAL);
timer = new Timer();
timer.schedule(timerTask, 1000, 1000);
start.setEnabled(false);
}
public void end(View view)
{
Sensor.unregisterListener(this);
displayCurrentValues(0, 0, 0);
try {
prnt.close();
} catch (IOException e) {
e.printStackTrace();
}
timer.cancel();
stop.setEnabled(false);
start.setEnabled(true);
}
@Override
public void onSensorChanged(SensorEvent event) {
deltax = Math.abs(event.values[0]-prevvalue[0]);
deltay = Math.abs(event.values[1]-prevvalue[1]);
deltaz = Math.abs(event.values[2]-prevvalue[2]);
findMaxValues(deltax,deltay,deltax);
if(Math.abs(deltax)<1)
{
deltax=0;
}
if(Math.abs(deltay)<1)
{
deltay=0;
}
if(Math.abs(deltaz)<1)
{
deltaz=0;
}
displayCurrentValues(deltax,deltay,deltaz);
prevvalue[0] = event.values[0];
prevvalue[1] = event.values[1];
prevvalue[2] = event.values[2];
}
private void findMaxValues(float x, float y, float z)
{
if(maxdeltax < x)
{
maxdeltax = x;
}
if(maxdeltay < y)
{
maxdeltay = y;
}
if(maxdeltaz < z)
{
maxdeltaz = z;
}
}
private void displayCurrentValues(float x, float y, float z)
{
curx.setText("x:"+Float.toString(x));
cury.setText("y:"+Float.toString(y));
curz.setText("z:"+Float.toString(z));
}
private void saveCurVals(float x, float y, float z)
{
count++;
try
{
prnt.write(Float.toString(x) + " " + Float.toString(y) + " " + Float.toString(z) + "\n");
prnt.flush();
}catch (IOException e)
{
e.printStackTrace();
}
if(file.length()>300)
{
redefineFile();
}
}
private void redefineFile()
{
int bigd = curd + 1;
file = new File("sdcard/vibration/data"+bigd+".txt");
curd = bigd;
try {
file.createNewFile();
prnt = new FileWriter(file,Boolean.TRUE);
} catch (IOException e) {
e.printStackTrace();
}
}
public void back(View view)
{
finish();
try {
prnt.close();
} catch (IOException e) {
e.printStackTrace();
}
}
@Override
public void onAccuracyChanged(Sensor sensor, int accuracy) {
if(accuracy == SensorManager.SENSOR_STATUS_ACCURACY_HIGH)
{
Toast.makeText(getApplicationContext(),"GOOD QUALITY and ACCURACY SENSOR",Toast.LENGTH_LONG).show();
}
}
}
Я исследовал о некоторых подобных ошибок, но все они имеют дело с кнопок не инициализируется правильно, что не мое дело. Пожалуйста, помогите мне. Спасибо
Можете ли вы опубликовать свой файл макета активности? –
Это конфликт идентификатора элемента управления. Вы должны передать тот же самый идентификатор кнопки в своем Java-коде, который у вас есть в XML-файле, чтобы правильно найти элемент управления. Я имею в виду, что в вашем XML-файле у вас есть кнопка «button» для кнопки «Пуск», и вы найдете ее в своем Java-коде с «R.id.button1», поэтому, пожалуйста, исправьте ее и попробуйте запустить. –