2017-02-11 19 views
-1

Я сделал проект андроида, который запустит датчик акселерометра и сохранит данные датчика 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(); 
     } 
    } 

} 

Я исследовал о некоторых подобных ошибок, но все они имеют дело с кнопок не инициализируется правильно, что не мое дело. Пожалуйста, помогите мне. Спасибо

+1

Можете ли вы опубликовать свой файл макета активности? –

+0

Это конфликт идентификатора элемента управления. Вы должны передать тот же самый идентификатор кнопки в своем Java-коде, который у вас есть в XML-файле, чтобы правильно найти элемент управления. Я имею в виду, что в вашем XML-файле у вас есть кнопка «button» для кнопки «Пуск», и вы найдете ее в своем Java-коде с «R.id.button1», поэтому, пожалуйста, исправьте ее и попробуйте запустить. –

ответ

1

В макете файл ваша пусковая кнопка имеет идентификатор R.id.button и в вас классе деятельности вы найти этот вид используя id R.id.button1. Ваше расположение:

<Button 
    android:layout_width="wrap_content" 
    android:layout_height="wrap_content" 
    android:text="Start Accelerometer" 
    android:id="@+id/button" <--- HERE 
    android:onClick="start" 
    android:layout_marginTop="300dp" 
    android:layout_marginStart="0dp" 
    android:layout_marginLeft="0dp" 
    android:textStyle="normal" 
    android:textSize="6pt"/> 

активность:

start = (Button)findViewById(R.id.button1); 

Вы должны установить одинаковые идентификаторы в обоих местах.

0

Даже если вы инициализируются ваши кнопки те не указывает на вашу деятельность кнопки макет это происходит для меня же в Android Studio