2015-08-25 4 views
-1

Забыл ли я что-то важное? B/c Android Studio не дает никаких ошибок, но при запуске приложения и нажатии кнопки (CALCULATE) приложение мгновенно вылетает.Я хочу построить простой калькулятор

Ошибка заключается в следующем:

"К сожалению, Calc остановилось."

код Java (callation.java):

package com.iodine.calc; 
import android.support.v7.app.AppCompatActivity; 
import android.os.Bundle; 
import android.view.Menu; 
import android.view.MenuItem; 
import android.view.View; 
import android.widget.Button; 
import android.widget.EditText; 
import android.view.View.OnClickListener; 
import android.widget.TextView; 


public class callation extends AppCompatActivity { 

@Override 
public void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.activity_callation); 

    EditText am = new EditText(this); 
    EditText pm = new EditText(this); 
    Button b = new Button(this); 

    am = (EditText) findViewById(R.id.number1); 
    pm = (EditText) findViewById(R.id.number2); 
    final TextView om = (TextView) findViewById(R.id.answer); 
    final String am1 = am.getText().toString(); 
    final String pm1 = pm.getText().toString(); 
    b = (Button) findViewById(R.id.button); 
    b.setOnClickListener(new OnClickListener() { 
     @Override 
     public void onClick(View b){ 
      om.setText(am1); 
      final Double number1 = Double.parseDouble(am1); 
      final Double number2 = Double.parseDouble(pm1); 

      switch (b.getId()) { 
       case R.id.plus: 
       Double totalD = number1 + number2; 
       String totalS = Double.toString(totalD); 
       om.setText("The answer is: " + totalS); 
        break; 
       case R.id.minus: 
        Double totalD1 = number1 - number2; 
        String totalS1 = Double.toString(totalD1); 
        om.setText("The answer is: " + totalS1); 
        break; 
       case R.id.multiply: 
        Double totalD2 = number1 * number2; 
        String totalS2 = Double.toString(totalD2); 
        om.setText("The answer is: " + totalS2); 
        break; 
       case R.id.divide: 
        Double totalD3 = number1/number2; 
        String totalS3 = Double.toString(totalD3); 
        om.setText("The answer is: " + totalS3); 
        break; 

     } 





     } 
    }); 
} 


@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_callation, 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); 
} 


} 

XML-код (activity_callation.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=".callation"> 

<EditText 
    android:layout_width="300dp" 
    android:layout_height="50dp" 
    android:id="@+id/number1" 
    android:layout_alignParentTop="true" 
    android:layout_centerHorizontal="true" 
    android:layout_marginTop="56dp" 
    android:inputType="number" /> 

<EditText 
    android:layout_width="300dp" 
    android:layout_height="50dp" 
    android:id="@+id/number2" 
    android:layout_marginTop="64dp" 
    android:layout_below="@+id/number1" 
    android:layout_alignLeft="@+id/number1" 
    android:layout_alignStart="@+id/number1" 
    android:inputType="number" /> 

<RadioButton 
    android:layout_width="wrap_content" 
    android:layout_height="wrap_content" 
    android:text="@string/plus" 
    android:id="@+id/plus" 
    android:layout_centerVertical="true" 
    android:layout_alignParentLeft="true" 
    android:layout_alignParentStart="true" /> 

<RadioButton 
    android:layout_width="wrap_content" 
    android:layout_height="wrap_content" 
    android:text="@string/minus" 
    android:id="@+id/minus" 
    android:layout_above="@+id/multiply" 
    android:layout_centerHorizontal="true" /> 

<RadioButton 
    android:layout_width="wrap_content" 
    android:layout_height="wrap_content" 
    android:text="@string/multiply" 
    android:id="@+id/multiply" 
    android:layout_below="@+id/plus" 
    android:layout_alignParentLeft="true" 
    android:layout_alignParentStart="true" 
    android:layout_marginTop="29dp" /> 

<RadioButton 
    android:layout_width="wrap_content" 
    android:layout_height="wrap_content" 
    android:text="@string/divide" 
    android:id="@+id/divide" 
    android:layout_alignTop="@+id/multiply" 
    android:layout_alignLeft="@+id/minus" 
    android:layout_alignStart="@+id/minus" /> 

<TextView 
    android:layout_width="300dp" 
    android:layout_height="50dp" 
    android:id="@+id/answer" 
    android:layout_alignParentBottom="true" 
    android:layout_centerHorizontal="true" 
    android:layout_marginBottom="64dp" 
    android:textColorHighlight="#010101" 
    android:textSize="14sp" /> 

<Button 
    android:layout_width="wrap_content" 
    android:layout_height="wrap_content" 
    android:text="@string/calc" 
    android:id="@+id/button" 
    android:layout_below="@+id/minus" 
    android:layout_alignParentRight="true" 
    android:layout_alignParentEnd="true" /> 

Не могли бы вы, пожалуйста, проверьте мой Java и/или XML код? Я был бы признателен, если бы вы исправили меня своими ошибками и нашли решение. Заранее спасибо.

+5

Вы должны отправить сообщение об ошибке, которое вы получаете в результате сбоя. –

+0

Это ошибка операционной системы Android: «К сожалению, Calc остановился». Это происходит, как только я нажимаю на кнопку. (Calc - это имя моего приложения) Как я уже сказал: Android Studio не дает никаких ошибок при запуске кода. –

+4

Вы должны получить ошибку из LOGCAT, а не из сообщения, которое обычно получает пользователь. –

ответ

-1

Я думаю, что вы случайно забыли:

android:onClick="whatever" 

где ваша кнопка. Просто поместите эту функцию внутри XML-кнопки calc. Внутри двойных кавычек поставить функцию, или в вашем случае, я бы рекомендовал создать новый метод под названием calcFunc и положив OnClick там, как это:

public void calcFunc(View view){ 
    EditText am = new EditText(this); 
    EditText pm = new EditText(this); 
    Button b = new Button(this); 

    am = (EditText) findViewById(R.id.number1); 
    pm = (EditText) findViewById(R.id.number2); 
    final TextView om = (TextView) findViewById(R.id.answer); 
    final String am1 = am.getText().toString(); 
    final String pm1 = pm.getText().toString(); 
    b = (Button) findViewById(R.id.button); 
    b.setOnClickListener(new OnClickListener() { 
    @Override 
    public void onClick(View b){ 
     om.setText(am1); 
     final Double number1 = Double.parseDouble(am1); 
     final Double number2 = Double.parseDouble(pm1); 

     switch (b.getId()) { 
      case R.id.plus: 
      Double totalD = number1 + number2; 
      String totalS = Double.toString(totalD); 
      om.setText("The answer is: " + totalS); 
       break; 
      case R.id.minus: 
       Double totalD1 = number1 - number2; 
       String totalS1 = Double.toString(totalD1); 
       om.setText("The answer is: " + totalS1); 
       break; 
      case R.id.multiply: 
       Double totalD2 = number1 * number2; 
       String totalS2 = Double.toString(totalD2); 
       om.setText("The answer is: " + totalS2); 
       break; 
      case R.id.divide: 
       Double totalD3 = number1/number2; 
       String totalS3 = Double.toString(totalD3); 
       om.setText("The answer is: " + totalS3); 
       break; 

    } 
} 

Затем установите OnClick так:

android:onClick="calcFunc" 
+0

Это не должно меняться, так как «OnClickListener» устанавливается программно. Кроме того, ваш код не будет работать должным образом, потому что код, который должен быть запущен, находится внутри прослушивателя, который не будет вызван до второго нажатия кнопки. – T3KBAU5

1

Первое место это приведет к краху:

final Double number1 = Double.parseDouble(am1); 

Вы не можете разобрать нулевое значение. Поскольку вы никогда не обновляете am1 или pm1 (которые вы can not anyways, так как вы установили их в final), они являются нулевыми, поскольку они устанавливаются только в init. Вот где я думаю, ваша авария происходит.

Другие мысли:

Это не будет работать, даже если он не откажет, как слушатель только на кнопку равно, и вы пытаетесь получить какие из переключателей выбираются из переданных в целях onclick. Это всегда будет то, что выбрало событие (в данном случае кнопку calc). Чтобы решить эту проблему, поместите радиокнопки в группу радиостанций, затем выберите, какой из них выбран.

Вам не нужно предварительно установить EditText ... перед установкой их:

EditText am = new EditText(this); 
EditText pm = new EditText(this); 
Button b = new Button(this); 

в

final EditText am = (EditText) view.findViewById(R.id.number1); 
... 

AM1 и pm1 не должны быть вне слушателя поместить их в этом также не заставляют вас ставить их в финал (чего вы не делаете в первом месте, но я понимаю, что именно поэтому вы их окончательно определили)

Есть и другие ошибки, но это позволит вам начать работу.

Еще одна важная вещь, которую вы назовете своей кнопкой, и параметр onClick pass в одно и то же (b) это РЕАЛЬНО! Плохо.

также в следующий раз, когда вы зададите такой вопрос, добавьте LOGCAT. вы можете найти его на вкладке Android в нижней части андроид-студии.

0

Эта строка кода очень сложно:

final Double number1 = Double.parseDouble(am1); 
final Double number2 = Double.parseDouble(pm1); 

Allways помнить, что, если и разобрать нужно окружить его Try/уловом block.If пользователь пишет что-то, что не могу быть разобраны в двойное значение (например, например, письмо), эта строка кода будет выдавать и исключать.

NumberFormatException - если строка не может быть проанализирована как двойное значение.

Это то, что вы можете изменить, чтобы избежать этого:

try { 
     final Double number1 = Double.parseDouble(am1); 
     final Double number2 = Double.parseDouble(pm1); 
    } catch (NumberFormatException e) { 
     Toast.makeText(this, "Please insert only numeric values!", Toast.LENGTH_SHORT); 
    } 

Таким образом, вы будете просто сделать тост, и вы избежите исключение.

Смежные вопросы