Урок 19. Пишем простой калькулятор

Обсуждение уроков
X11
Сообщения: 1
Зарегистрирован: 26 фев 2017, 19:01

Re: Урок 19. Пишем простой калькулятор

Сообщение X11 » 26 фев 2017, 19:11

Iosif писал(а):Не появляется меню с очисткой полей и выхода из приложения, подскажите, что не так сделал:


.............................

public class MainActivity extends Activity implements View.OnClickListener {

EditText etNum1;
EditText etNum2;

Button btnAdd;
Button btnSub;
Button btnMult;
Button btnDiv;

TextView tvResult;

String oper = "";
final int MENU_RESET_ID = 1;
final int MENU_QUIT_ID = 2;

/** Called when the activity is first created. */
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);

// находим элементы
etNum1 = (EditText) findViewById(R.id.etNum1);
etNum2 = (EditText) findViewById(R.id.etNum2);

btnAdd = (Button) findViewById(R.id.btnAdd);
btnSub = (Button) findViewById(R.id.btnSub);
btnMult = (Button) findViewById(R.id.btnMult);
btnDiv = (Button) findViewById(R.id.btnDiv);

tvResult = (TextView) findViewById(R.id.tvResult);

// прописываем обработчик
btnAdd.setOnClickListener(this);
btnSub.setOnClickListener(this);
btnMult.setOnClickListener(this);
btnDiv.setOnClickListener(this);

}
// создание меню
@Override
public boolean onCreateOptionsMenu(Menu menu) {
menu.add(0, MENU_RESET_ID, 0, "Reset");
menu.add(0, MENU_QUIT_ID, 0, "Quit");
return super.onCreateOptionsMenu(menu);
}
...............................
Ты код создания меню и инициализации обработчика нажатий на пункты забросил в OnClickListener, следовательно
оно будет инициализировано при каждом нажатии на кнопки. Наверное правильнее вот так :

Код: Выделить всё

   /** Called when the activity is first created. */
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        // находим элементы
        etNum1 = (EditText) findViewById(R.id.etNum1);
        etNum2 = (EditText) findViewById(R.id.etNum2);

        btnAdd = (Button) findViewById(R.id.btnAdd);
        btnSub = (Button) findViewById(R.id.btnSub);
        btnMult = (Button) findViewById(R.id.btnMult);
        btnDiv = (Button) findViewById(R.id.btnDiv);

        tvResult = (TextView) findViewById(R.id.tvResult);

        // прописываем обработчик
        btnAdd.setOnClickListener(this);
        btnSub.setOnClickListener(this);
        btnMult.setOnClickListener(this);
        btnDiv.setOnClickListener(this);

    }

    @Override
    public void onClick(View v) {
        // TODO Auto-generated method stub
        float num1 = 0;
        float num2 = 0;
        float result = 0;

        // Проверяем поля на пустоту
        if (TextUtils.isEmpty(etNum1.getText().toString())
                || TextUtils.isEmpty(etNum2.getText().toString()))    {
            return;
        }

        // читаем EditText и заполняем переменные числами
        num1 = Float.parseFloat(etNum1.getText().toString());
        num2 = Float.parseFloat(etNum2.getText().toString());
        if( num2 == 0 ){
            Toast.makeText(this,"БЕСКОНЕЧНОСТЬ ОДНАКО ПОЛУЧАЕТСЯ!  ",Toast.LENGTH_LONG).show();

          return;
        }
        // определяем нажатую кнопку и выполняем соответствующую операцию
        // в oper пишем операцию, потом будем использовать в выводе
        switch (v.getId()) {
            case R.id.btnAdd:
                oper = "+";
                result = num1 + num2;
                break;
            case R.id.btnSub:
                oper = "-";
                result = num1 - num2;
                break;
            case R.id.btnMult:
                oper = "*";
                result = num1 * num2;
                break;
            case R.id.btnDiv:
                oper = "/";
                result = num1 / num2;
                break;
            default:
                break;
        }

        // формируем строку вывода
        tvResult.setText(num1 + " " + oper + " " + num2 + " = " + result);
    }
    // создание меню
    @Override
    public boolean onCreateOptionsMenu(Menu menu) {
        menu.add(0, MENU_RESET_ID, 0, "Reset");
        menu.add(0, MENU_QUIT_ID, 0, "Quit");
        return super.onCreateOptionsMenu(menu);
    }

    // обработка нажатий на пункты меню
    @Override
    public boolean onOptionsItemSelected(MenuItem item) {
        switch (item.getItemId()) {
            case MENU_RESET_ID:
                // очищаем поля
                etNum1.setText("0000");
                etNum2.setText("");
                tvResult.setText("");
                break;
            case MENU_QUIT_ID:
                // выход из приложения
                finish();
                break;
        }
        return super.onOptionsItemSelected(item);
    }






petrash
Сообщения: 1
Зарегистрирован: 24 июн 2017, 01:06

Re: Урок 19. Пишем простой калькулятор

Сообщение petrash » 24 июн 2017, 01:10

Немного переписал с использованием ButterKnife, если кому-то интересно

Код: Выделить всё

package ru.petrash.p0191simplecalc;

import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.text.TextUtils;
import android.view.Menu;
import android.view.MenuItem;
import android.widget.Button;
import android.widget.EditText;
import android.widget.TextView;
import android.widget.Toast;

import java.util.List;

import butterknife.BindView;
import butterknife.BindViews;
import butterknife.ButterKnife;
import butterknife.OnClick;

public class MainActivity extends AppCompatActivity {

    @BindViews({R.id.etNum1, R.id.etNum2})
    List<EditText> etNums;
    @BindViews({R.id.btnAdd, R.id.btnDiv, R.id.btnMult, R.id.btnSub})
    List<Button> btns;
    @BindView(R.id.tvResult)
    TextView tvResult;

    String oper = "";

    final int MENU_RESET_ID = 1;
    final int MENU_QUIT_ID = 2;

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

    @OnClick({R.id.btnAdd, R.id.btnDiv, R.id.btnMult, R.id.btnSub}) //без Listener'ов вешает OnClick на переданные объекты
    public void onClick(Button b) {
        float num1 = 0;
        float num2 = 0;
        float res = 0;
        for (int i = 0; i < etNums.size(); i++) {
            if (TextUtils.isEmpty(etNums.get(i).getText().toString())) {
                return;
            }
        }
        num1 = Float.parseFloat(etNums.get(0).getText().toString());
        num2 = Float.parseFloat(etNums.get(1).getText().toString());

        switch (b.getId()) {
            case R.id.btnAdd:
                oper = "+";
                res = num1 + num2;
                break;
            case R.id.btnSub:
                oper = "-";
                res = num1 - num2;
                break;
            case R.id.btnMult:
                oper = "*";
                res = num1 * num2;
                break;
            case R.id.btnDiv:
                oper = "/";
                if (!checkDivideByZero(num2)) {
                    return;
                } else res = num1 / num2;
                break;
            default:
                break;
        }
        tvResult.setText(num1 + " " + oper + " " + num2 + " " + " = " + res);
    }

    @Override
    public boolean onCreateOptionsMenu(Menu menu) {
        menu.add(0, MENU_RESET_ID, 0, "Reset");
        menu.add(0, MENU_QUIT_ID, 0, "Quit");

        return super.onCreateOptionsMenu(menu);
    }

    @Override
    public boolean onOptionsItemSelected(MenuItem item) {
        switch (item.getItemId()) {
            case MENU_RESET_ID:
                clearAll();
                break;
            case MENU_QUIT_ID:
                finish();
                break;
        }
        return super.onOptionsItemSelected(item);
    }
    //отдельно вынес проверку деления на 0 и очистку полей
    private boolean checkDivideByZero(float n) {
        if (n == 0.00) {
            Toast.makeText(this, "Divide by zero is not allowed", Toast.LENGTH_LONG).show();
            clearAll();
            return false;
        } else return true;
    }

    private void clearAll() {
        tvResult.setText("");
        for (EditText e : etNums
                ) {
            e.setText("");
        }
    }
}


Get124
Сообщения: 1
Зарегистрирован: 26 июн 2018, 15:19

Re: Урок 19. Пишем простой калькулятор

Сообщение Get124 » 26 июн 2018, 15:40

Не могу создать меню, в MainActivity прописываю:
@Override
public boolean onCreateOptionsMenu(Menu menu) {
menu.add(0, 1, 0, "Очистить");
menu.add(0, 2, 0, "Выйти");
return super.onCreateOptionsMenu(menu);
}
компилятор ошибок не выдает, запускает "калькулятор", все работает, но нет меню..
Пробовал разные варианты, копировал код с урока, результат тот же.
Добавил два "баттона" вместо меню, ушел в следующий урок, но очень любопытно почему не вижу меню, помогите разобраться.

evgeniy-1c
Сообщения: 4
Зарегистрирован: 14 июл 2017, 12:42

Re: Урок 19. Пишем простой калькулятор

Сообщение evgeniy-1c » 20 ноя 2018, 16:56

В AVD на Адроид 8 Орео с гапсами (API 26) не появляется меню (хардварных кнопок нет, а через Ctrl+M не выводится). Кто-нибудь знает в чем может быть проблема? Код показывать смысла большого не вижу, так как на виртуальном устройстве с API 22 меню работает, как ему и положено (кроме того, код идентичен тому, что в уроке). И если я вместо Ctrl+M нажимаю комбинацию Ctrl+Shift+M, то вываливаюсь в меню настройки микрофона (как и должно быть для этой комбинации клавиш). Хотя бы укажите путь, куда копать? В гугле не нашел подходящего ответа.

Naksa
Сообщения: 1
Зарегистрирован: 20 июл 2019, 16:09

Re: Урок 19. Пишем простой калькулятор

Сообщение Naksa » 20 июл 2019, 16:15

evgeniy-1c писал(а):В AVD на Адроид 8 Орео с гапсами (API 26) не появляется меню (хардварных кнопок нет, а через Ctrl+M не выводится). Кто-нибудь знает в чем может быть проблема? ... Хотя бы укажите путь, куда копать? В гугле не нашел подходящего ответа.
для юных падаванов, вливающихся в ряды программистов под Android:
как вариант - заменить extends Activity на extends AppCompatActivity, тогда меню появится.
и соответственно поправить import.

Ответить