2015-09-10 153 views
-1

我有一些我在Android Studio中工作的代碼。目標是創建一個應用程序,當您按下開始按鈕時,該應用程序的計數器會快速上升,一旦達到所需輸入,您將按下停止按鈕,並記錄距離期望值有多遠。這是測試反應時間等。問題是,無論何時我在手機或模擬器上運行應用程序,應用程序立即崩潰都會給出錯誤「不幸的是,Timer Test已停止工作。」有人知道問題可能是什麼嗎?Android Studio代碼無法正常工作?

在MainActivity.java代碼:

package com.ultraman11.timertest; 

import android.support.v7.app.AppCompatActivity; 
import android.os.Bundle; 
import android.text.Editable; 
import android.view.Menu; 
import android.view.MenuItem; 
import android.view.View; 
import android.widget.TextView; 
import android.widget.EditText; 

public class MainActivity extends AppCompatActivity { 

    public int numCounter = 0; 
    public boolean counting = false; 

    TextView counter = (TextView) findViewById(R.id.counter); 
    TextView difference = (TextView) findViewById(R.id.diff); 
    EditText numInput = (EditText) findViewById(R.id.numInput); 

    public int userInt = Integer.parseInt(numInput.getText().toString()); 
    public int differenceInt = Math.abs(numCounter - userInt); 

    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.activity_main); 
    } 

    public void resetButton(View v){ 
     numCounter = 0; 
     difference.setText("Difference: "); 
     counter.setText(Integer.toString(0)); 
    } 

    public void startButton(View v){ 
     counting = true; 
     while(counting){ 
      numCounter++; 
     } 
    } 

    public void stopButton(View v){ 
     counting = false; 
     difference.setText("Difference: " + Integer.toString(differenceInt)); 
    } 

    @Override 
    public boolean onCreateOptionsMenu(Menu menu) { 
     // Inflate the menu; this adds items to the action bar if it is present. 
     getMenuInflater().inflate(R.menu.menu_main, menu); 
     return true; 
    } 

    @Override 
    public boolean onOptionsItemSelected(MenuItem item) { 
     // Handle action bar item clicks here. The action bar will 
     // automatically handle clicks on the Home/Up button, so long 
     // as you specify a parent activity in AndroidManifest.xml. 
     int id = item.getItemId(); 

     //noinspection SimplifiableIfStatement 
     if (id == R.id.action_settings) { 
      return true; 
     } 

     return super.onOptionsItemSelected(item); 
    } 
} 

在activity_main.xml中的代碼

<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:paddingLeft="@dimen/activity_horizontal_margin" 
    android:paddingRight="@dimen/activity_horizontal_margin" 
    android:paddingTop="@dimen/activity_vertical_margin" 
    android:paddingBottom="@dimen/activity_vertical_margin" tools:context=".MainActivity"> 

    <Button 
     android:layout_width="wrap_content" 
     android:layout_height="wrap_content" 
     android:text="Reset" 
     android:id="@+id/button" 
     android:nestedScrollingEnabled="false" 
     android:onClick="resetButton" 
     android:layout_below="@+id/numInput" 
     android:layout_centerHorizontal="true" 
     android:layout_marginTop="38dp" /> 

    <Button 
     android:layout_width="wrap_content" 
     android:layout_height="wrap_content" 
     android:text="Start" 
     android:id="@+id/button2" 
     android:onClick="startButton" 
     android:layout_below="@+id/numInput" 
     android:layout_alignLeft="@+id/button" 
     android:layout_alignStart="@+id/button" 
     android:layout_marginTop="112dp" /> 

    <TextView 
     android:layout_width="wrap_content" 
     android:layout_height="wrap_content" 
     android:textAppearance="?android:attr/textAppearanceLarge" 
     android:text="0" 
     android:id="@+id/counter" 
     android:layout_alignParentTop="true" 
     android:layout_centerHorizontal="true" 
     android:layout_marginTop="79dp" /> 

    <EditText 
     android:layout_width="wrap_content" 
     android:layout_height="wrap_content" 
     android:id="@+id/numInput" 
     android:inputType="number" 
     android:layout_below="@+id/counter" 
     android:layout_alignLeft="@+id/button" 
     android:layout_alignStart="@+id/button" 
     android:layout_marginTop="31dp" 
     android:layout_alignRight="@+id/button" 
     android:layout_alignEnd="@+id/button" /> 

    <Button 
     android:layout_width="wrap_content" 
     android:layout_height="wrap_content" 
     android:text="Stop" 
     android:id="@+id/button3" 
     android:layout_marginTop="23dp" 
     android:layout_below="@+id/button2" 
     android:layout_alignLeft="@+id/button2" 
     android:layout_alignStart="@+id/button2" 
     android:onClick="stopButton" /> 

    <TextView 
     android:layout_width="wrap_content" 
     android:layout_height="wrap_content" 
     android:textAppearance="?android:attr/textAppearanceLarge" 
     android:text="Difference: " 
     android:id="@+id/diff" 
     android:layout_alignParentBottom="true" 
     android:layout_centerHorizontal="true" 
     android:layout_marginBottom="43dp" /> 
</RelativeLayout> 

logcat的錯誤

09-10 17:33:45.103: D/AndroidRuntime(3445): Shutting down VM 
09-10 17:33:45.104: E/AndroidRuntime(3445): FATAL EXCEPTION: main 
09-10 17:33:45.104: E/AndroidRuntime(3445): Process: com.ultraman11.timertest, PID: 3445 
09-10 17:33:45.104: E/AndroidRuntime(3445): java.lang.RuntimeException: Unable to start activity ComponentInfo{com.ultraman11.timertest/com.ultraman11.timertest.MainActivity}: java.lang.IllegalStateException: You need to use a Theme.AppCompat theme (or descendant) with this activity. 
09-10 17:33:45.104: E/AndroidRuntime(3445):  at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2325) 
09-10 17:33:45.104: E/AndroidRuntime(3445):  at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2387) 
09-10 17:33:45.104: E/AndroidRuntime(3445):  at android.app.ActivityThread.access$800(ActivityThread.java:151) 
09-10 17:33:45.104: E/AndroidRuntime(3445):  at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1303) 
09-10 17:33:45.104: E/AndroidRuntime(3445):  at android.os.Handler.dispatchMessage(Handler.java:102) 
09-10 17:33:45.104: E/AndroidRuntime(3445):  at android.os.Looper.loop(Looper.java:135) 
09-10 17:33:45.104: E/AndroidRuntime(3445):  at android.app.ActivityThread.main(ActivityThread.java:5254) 
09-10 17:33:45.104: E/AndroidRuntime(3445):  at java.lang.reflect.Method.invoke(Native Method) 
09-10 17:33:45.104: E/AndroidRuntime(3445):  at java.lang.reflect.Method.invoke(Method.java:372) 
09-10 17:33:45.104: E/AndroidRuntime(3445):  at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:903) 
09-10 17:33:45.104: E/AndroidRuntime(3445):  at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:698) 
09-10 17:33:45.104: E/AndroidRuntime(3445): Caused by: java.lang.IllegalStateException: You need to use a Theme.AppCompat theme (or descendant) with this activity. 
09-10 17:33:45.104: E/AndroidRuntime(3445):  at android.support.v7.app.AppCompatDelegateImplBase.onCreate(AppCompatDelegateImplBase.java:124) 
09-10 17:33:45.104: E/AndroidRuntime(3445):  at android.support.v7.app.AppCompatDelegateImplV7.onCreate(AppCompatDelegateImplV7.java:146) 
09-10 17:33:45.104: E/AndroidRuntime(3445):  at android.support.v7.app.AppCompatActivity.onCreate(AppCompatActivity.java:59) 
09-10 17:33:45.104: E/AndroidRuntime(3445):  at com.ultraman11.timertest.MainActivity.onCreate(MainActivity.java:26) 
09-10 17:33:45.104: E/AndroidRuntime(3445):  at android.app.Activity.performCreate(Activity.java:5990) 
09-10 17:33:45.104: E/AndroidRuntime(3445):  at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1106) 
09-10 17:33:45.104: E/AndroidRuntime(3445):  at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2278) 
09-10 17:33:45.104: E/AndroidRuntime(3445):  ... 10 more 
09-10 17:33:47.163: I/Process(3445): Sending signal. PID: 3445 SIG: 9 
+1

請提供堆棧跟蹤從logcat的 – sberezin

+0

無堆棧跟蹤,我們只能掃描你的代碼,並試圖找出問題的出處。請幫助我們,通過發佈堆棧跟蹤和相關信息來幫助您。這有助於我們更容易地爲您提供幫助。 – JoxTraex

回答

0

您必須初始化活動的的onCreate()方法裏面的觀點。我編輯了你的java文件。嘗試這個。

package com.ultraman11.timertest; 

import android.support.v7.app.AppCompatActivity; 
import android.os.Bundle; 
import android.text.Editable; 
import android.view.Menu; 
import android.view.MenuItem; 
import android.view.View; 
import android.widget.TextView; 
import android.widget.EditText; 

public class MainActivity extends AppCompatActivity { 

    public int numCounter = 0; 
    public boolean counting = false; 

    TextView counter; 
    TextView difference; 
    EditText numInput; 

    public int userInt 
    public int differenceInt; 

    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.activity_main); 

     counter = (TextView) findViewById(R.id.counter); 
     difference = (TextView) findViewById(R.id.diff); 
     numInput = (EditText) findViewById(R.id.numInput); 

     try{ 
      userInt = Integer.parseInt(numInput.getText().toString()); 
     }Catch(Exception e){ 
      userInt = 0; 
     }    
     differenceInt = Math.abs(numCounter - userInt); 
    } 

    public void resetButton(View v){ 
     numCounter = 0; 
     difference.setText("Difference: "); 
     counter.setText(Integer.toString(0)); 
    } 

    public void startButton(View v){ 
     counting = true; 
     while(counting){ 
      numCounter++; 
     } 
    } 

    public void stopButton(View v){ 
     counting = false; 
     difference.setText("Difference: " + Integer.toString(differenceInt)); 
    } 

    @Override 
    public boolean onCreateOptionsMenu(Menu menu) { 
     // Inflate the menu; this adds items to the action bar if it is present. 
     getMenuInflater().inflate(R.menu.menu_main, menu); 
     return true; 
    } 

    @Override 
    public boolean onOptionsItemSelected(MenuItem item) { 
     // Handle action bar item clicks here. The action bar will 
     // automatically handle clicks on the Home/Up button, so long 
     // as you specify a parent activity in AndroidManifest.xml. 
     int id = item.getItemId(); 

     //noinspection SimplifiableIfStatement 
     if (id == R.id.action_settings) { 
      return true; 
     } 

     return super.onOptionsItemSelected(item); 
    } 
} 

更新的代碼

package com.ultraman11.timertest; 

import java.util.Timer; 
import java.util.TimerTask; 

import android.app.Activity; 
import android.os.Bundle; 
import android.view.View; 
import android.widget.EditText; 
import android.widget.TextView; 

public class MainActivity extends Activity { 

    public int numCounter = 0; 
    public boolean counting = false; 

    TextView counter; 
    TextView difference; 
    EditText numInput; 

    public int userInt; 
    public int differenceInt; 

    TimerTask timertask = null; 
    Timer timer = null ; 

    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.activity_main); 

     counter = (TextView) findViewById(R.id.counter); 
     difference = (TextView) findViewById(R.id.diff); 
     numInput = (EditText) findViewById(R.id.numInput); 
    } 

    public void resetButton(View v){ 
     numCounter = 0; 
     difference.setText("Difference: "); 
     counter.setText(Integer.toString(0)); 
     if(timertask!=null){ 
      timertask.cancel(); 
      timertask = null; 
     } 
     if(timer!=null){ 
      timer.cancel(); 
      timer = null; 
     } 
    } 

    public void startButton(View v){ 
     if(timertask!=null){ 
      timertask.cancel(); 
      timertask = null; 
     } 
     if(timer!=null){ 
      timer.cancel(); 
      timer = null; 
     } 

     timer = new Timer(); 
     timertask = new TimerTask() { 

      @Override 
      public void run() { 
       numCounter++; 
       runOnUiThread(new Runnable() { 
        public void run() { 
         counter.setText(Integer.toString(numCounter)); 
        } 
       }); 
      } 
     }; 
     timer.scheduleAtFixedRate(timertask, 0, 1000); 
    } 

    public void stopButton(View v){ 
     if(timertask!=null){ 
      timertask.cancel(); 
      timertask = null; 
     } 
     if(timer!=null){ 
      timer.cancel(); 
      timer = null; 
     } 

     try{ 
       userInt = Integer.parseInt(numInput.getText().toString()); 
     }catch(Exception e){ 
      userInt = 0; 
     }    
     differenceInt = Math.abs(numCounter - userInt); 
     difference.setText("Difference: " + Integer.toString(differenceInt)); 
    } 

    @Override 
    protected void onDestroy() { 
     if(timertask!=null){ 
      timertask.cancel(); 
      timertask = null; 
     } 

     if(timer!=null){ 
      timer.cancel(); 
      timer = null; 
     } 
     super.onDestroy(); 
    } 
} 
+0

我剛試過這個,它仍然墜毀。 –

+0

你能分享你的logcat錯誤嗎? –

+0

剛剛更新了與我使用您的編輯代碼logcat錯誤的主要帖子。 –

1

你得到立刻在一個循環中,當你打因爲計數是真的,所以它只是將numCounter增加到infty。 而不是圍繞增量的東西,而使用像AsyncTask的東西來增加你的價值。

編輯: 對不起,我沒有得到它崩潰immedietly,確保您initalize在onCreate方法您的內容不點之前調用的onCreate ...的setContentView()

+0

我在開始時將計數設置爲false。即使我還沒有按下按鈕功能,它是否設置爲true? –

+0

真正的問題是視圖如何初始化,就像編輯中提到的一樣。 – akodiakson

+0

在onCreate()方法中初始化我的內容時,其他代碼都沒有工作,因爲找不到這些值。 (我指的內容是文本和編輯視圖。) –

0

不能使用調用onCreate()之前的findViewById()。您需要更改:

TextView counter; 
TextView difference; 
EditText numInput; 

,並將它們設置在onCreate()

@Override 
protected void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.activity_main); 
    counter = (TextView) findViewById(R.id.counter); 
    difference = (TextView) findViewById(R.id.diff); 
    numInput = (EditText) findViewById(R.id.numInput); 
} 
0

這是一個簡單的錯誤,所以很多人做。看着LogCat,它會告訴你,你需要使用Theme.AppCompat或類似的。 AppCompat需要AppCompat。它與設備主題不兼容。 所有你需要做的就是打開你的AndroidManifest.xml並做到這一點:

<application 
    ... 
    android:theme="@style/AppTheme"> 
    ... 
</application> 

而且在/res/values/styles.xml補充一點:

<?xml version="1.0" encoding="utf-8"?> 
<resources> 
    <style name="AppBaseTheme" parent="Theme.AppCompat"/> 
    <style name="AppTheme" parent="AppBaseTheme"> 
     <!-- Put any customizations here. --> 
    </style> 
</resources>