Создание меню калькулятора в Android - PullRequest
0 голосов
/ 07 ноября 2018

Я хочу создать калькулятор с помощью меню.

Я ввожу первое и второе число и выбираю, хочу ли я сложить, вычесть, разделить, умножить два числа или умножить результат умножения на 3 или 4.

Используя меню параметров и контекстное меню тоже. Это то, что я сделал до сих пор.

package com.example.asus.menuassignment;

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

public class MainActivity extends AppCompatActivity {


    EditText text1;
    EditText text2;
    TextView text;
    int fNum;
    int sNum;
    int result;
    @Override
    protected void onCreate(Bundle savedInstanceState)
    {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        text1 = (EditText)findViewById(R.id.editText);
        text2 = (EditText)findViewById(R.id.editText2);
        text = (TextView)findViewById(R.id.textView3);
        fNum = Integer.parseInt(text1.getText().toString());
        sNum = Integer.parseInt(text2.getText().toString());
        registerForContextMenu(text);

    }
//options menu part
    @Override
    public boolean onCreateOptionsMenu(Menu menu)
    {
        getMenuInflater().inflate(R.menu.menu, menu);
        return super.onCreateOptionsMenu(menu);
    }

    @Override
    public boolean onOptionsItemSelected(MenuItem item)
    {

        switch (item.getItemId())
        {
            //multiply

            case R.id.item1:
                result = fNum*sNum;
                text.setText(String.valueOf(result));
                return true;

            //multiplying a result by 3 or 4
            case R.id.item11:
                result = result * 3;
                text.setText(String.valueOf(result));
                return true;
            case R.id.item12:
                result = result * 4;
                text.setText(String.valueOf(result));
                return true;

                //Add
            case R.id.item2:
                result = fNum + sNum;
                text.setText(String.valueOf(result));
                return true;
                //Subtract
            case R.id.item3:
                result = fNum - sNum;
                text.setText(String.valueOf(result));
                return true;
                //Divide
            case R.id.item4:
                result = fNum / sNum;
                text.setText(String.valueOf(result));
                return true;


        }
        return super.onOptionsItemSelected(item);
    }
 //By long pressing the result a context menu appears
    @Override
    public void onCreateContextMenu(ContextMenu menu, View v, ContextMenu.ContextMenuInfo menuInfo)
    {
        getMenuInflater().inflate(R.menu.menu, menu);
        super.onCreateContextMenu(menu, v, menuInfo);
    }

    @Override
    public boolean onContextItemSelected(MenuItem item)
    {
        switch (item.getItemId()) {
            //multiply

            case R.id.item1:
                result = fNum * sNum;
                text.setText(String.valueOf(result));
                return true;

            //multiplying a result by 3 or 4
            case R.id.item11:
                result = result * 3;
                text.setText(String.valueOf(result));
                return true;
            case R.id.item12:
                result = result * 4;
                text.setText(String.valueOf(result));
                return true;

            //Add
            case R.id.item2:
                result = fNum + sNum;
                text.setText(String.valueOf(result));
                return true;
            //Subtract
            case R.id.item3:
                result = fNum - sNum;
                text.setText(String.valueOf(result));
                return true;
            //Divide
            case R.id.item4:
                result = fNum / sNum;
                text.setText(String.valueOf(result));
                return true;
        }

        return super.onContextItemSelected(item);
    }

}

У меня нет ошибок, но приложение вылетает, что именно не так или чего здесь не хватает?

Обновление: Это logcat

Ответы [ 2 ]

0 голосов
/ 07 ноября 2018

значения textview text1 & text2 равны нулю, поэтому он потерпел крах удалить инициализацию в onCreate

    @Override
    protected void onCreate(Bundle savedInstanceState)
    {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        text1 = (EditText)findViewById(R.id.editText);
        text2 = (EditText)findViewById(R.id.editText2);
        text = (TextView)findViewById(R.id.textView3);        
        // fNum = Integer.parseInt(text1.getText().toString()); // remove this line        
        // sNum = Integer.parseInt(text2.getText().toString()); // remove this line
        registerForContextMenu(text);

    }

И так как вы объявляете fNum & sNum глобальной переменной. Мы можем создать функцию и получить значение из text1 & text2

// Get the data from text view
private void getData() { 
   fNum = Integer.parseInt(text1.getText() + ""); 
   sNum = Integer.parseInt(text2.getText() + ""); 
}

и вызовите его перед выполнением расчетов

@Override
public boolean onOptionsItemSelected(MenuItem item) {

    getData() // GET THE DATA

    switch (item.getItemId()) {
        case R.id.item1:
            result = fNum*sNum;
            text.setText(String.valueOf(result));
            return true;
        .
        .
        .
    }
    return super.onOptionsItemSelected(item);
}

, а также здесь:

@Override
public boolean onContextItemSelected(MenuItem item) {

    getData() // GET THE DATA

    switch (item.getItemId()) {
        case R.id.item1:
            result = fNum * sNum;
            text.setText(String.valueOf(result));
            return true;
        .
        .
        .
    return super.onContextItemSelected(item);
}
0 голосов
/ 07 ноября 2018

Приложение вылетает из-за кода ниже fNum = Integer.parseInt (text1.getText (). toString ()); sNum = Integer.parseInt (text2.getText (). toString ());

Изначально в текстовом просмотре не будет никакого значения. Удалите эти строки из метода setContentView. Добавьте эти строки в функцию OnOptionsItemSelected перед вычислением результата.

Надеюсь, это поможет.

...