Програмуємо калькулятор на андроїд. Урок 3

Урок 3. Створюємо меню.

У цьому уроці створемо меню, що складається з двох пунктів – “Налаштування” і “Про програму”

Для роботи з меню в нашому activity є два методи onCreateOptionsMenu – в ньому створюється саме меню, і onOptionsItemSelected – в ньому обробляються натискання на пункти меню.

Пункти меню можна створити програмно: menu.add ( “Item of menu1”), або взяти їх з XML файлу. За замовчуванням onCreateOptionsMenu вже містить в собі метод, який створює меню з XML:

getMenuInflater (). inflate (R.menu.main, menu);

Сам xml-файл меню теж вже створений за нас. Знайти його можна за адресою res\menu\main.xml. Можна створити свій файл або використовувати той що нам запропоновано за замовчуванням. Ми будемо редагувати наявний. До речі в ньому вже заданий один пункт меню. Якщо запустити додаток в емуляторі і натиснути PageUp, ми побачимо меню з цим одним пунктом, але при натисканні на нього нічого не станеться.

Відкриваємо main.xml. Тут заданий один пункт.

<item
   android:id="@+id/action_settings"
   android:orderInCategory="100"
   android:showAsAction="never"
   android:title="@string/action_settings"/>

Зараз нас цікавлять параметри id – ідентифікатор пункту за яким будемо знаходити його в коді і title – текст, який буде відображатися на пункті. Текст можна задати прямо тут:

   android: title = "Налаштування"

Але це не зовсім правильно, тому що це ускладнить локалізацію программи, тобто якщо ми захочемо щоб у программи був не тільки україномовний інтерфейс. Тому краще використовувати текст з строкових констант, які описані у файлі res\value\string.xml. Відкриємо його.


   <String name = "app_name"> super_calc </ string>
   <String name = "hello_world"> Hello world! </ String>
   <String name = "action_settings"> Settings </ string>

Тут вже описані три рядкові константи. app_name – це ім’я нашої програми. Його ми бачимо у заголовку activity, при запуску на емуляторі. Інші дві константи ми використовувати не будемо, їх можна видалити. Змінимо ім’я програми та додамо дві нові, що відповідають пунктам меню.


   <String name = "app_name"> Калькулятор </ string>
   <String name = "options"> Налаштування </ string>
   <String name = "about_app"> Про програму</ string>

Повертаємося до файлу меню main.xml, видаляємо пункт за замовчуванням, дописуємо два своїх.


   <item
      android:id="@+id/options_menu"
      android:title="@string/options"/>
  <item
      android:id="@+id/about_menu"
      android:title="@string/about_app"/>

Повертаємося у MainActivity.java до методу onOptionsItemSelected. Видаляємо обробку видаленого пункту меню, ставимо switch для наших пунктів. Визначаємо id натиснутого пункту і виводимо на екран повідомлення про натиснутий пункт.


@Override
public boolean onOptionsItemSelected(MenuItem item) {
   switch(item.getItemId()){
   case R.id.options_menu:
      Toast.makeText(this, R.string.options, Toast.LENGTH_LONG).show();
   break;
   case R.id.about_menu:
      Toast.makeText(this, R.string.about_app, Toast.LENGTH_LONG).show();
   break;
}
   return super.onOptionsItemSelected(item);
}

Така обробка натискання пунктів меню – тимчасовий захід. Згодом ми будемо після натискання відкривати екрани налаштувань і “Про програму”. Але їх спочатку потрібно створити і зареєструвати у файлі AndroidManifest.xml. Цим займемося у наступних уроках.

Запускаємо програму на емуляторі, тестуємо меню.

Лістинг файлів до яких ми вносили зміни:


string.xml
<?xml version="1.0" encoding="utf-8"?>
   <resources>
   <string name="app_name">Калькулятор</string>
   <string name="options">Налаштування</string>
   <string name="about_app">Про програму</string>
   </resources>

main.xml (меню)
<menu xmlns:android="http://schemas.android.com/apk/res/android"
   xmlns:tools="http://schemas.android.com/tools"
   tools:context="ru.urok.super_calc.MainActivity" >
<item
   android:id="@+id/options_menu"
   android:title="@string/options"/>
<item
   android:id="@+id/about_menu"
   android:title="@string/about_app"/>
</menu>

MainActivity.java

package ru.urok.super_calc;

import android.app.Activity;
import android.os.Bundle;
import android.view.Menu;
import android.view.MenuItem;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;
import android.widget.TextView;
import android.widget.Toast;

public class MainActivity extends Activity implements OnClickListener {
//оголошуємо кнопки і текстове поле
Button btOne, btTwo, btThree, btFour, btFive;
Button btSix, btSeven, btEight, btNine, btZero;
Button btPlus, btMinus, btMulti, btDiv, btEqual, btClear;
TextView tvLCD;

// оголошуємо змінні для обчислень
int operand1, operand2, flagAction;
double result;

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

//зв'язуємо кнопки с макетом
   btOne = (Button) findViewById(R.id.btOne);
   btTwo = (Button) findViewById(R.id.btTwo);
   btThree = (Button) findViewById(R.id.btThree);
   btFour = (Button) findViewById(R.id.btFour);
   btFive = (Button) findViewById(R.id.btFive);
   btSix = (Button) findViewById(R.id.btSix);
   btSeven = (Button) findViewById(R.id.btSeven);
   btEight = (Button) findViewById(R.id.btEight);
   btNine = (Button) findViewById(R.id.btNine);
   btZero = (Button) findViewById(R.id.btZero);
   btPlus = (Button) findViewById(R.id.btPlus);
   btMinus = (Button) findViewById(R.id.btMinus);
   btMulti = (Button) findViewById(R.id.btMulti);
   btDiv = (Button) findViewById(R.id.btDiv);
   btEqual = (Button) findViewById(R.id.btEqual);
   btClear = (Button) findViewById(R.id.btClear);
   tvLCD = (TextView) findViewById(R.id.tvLCD);

//призначаємо кнопкам слухача
   btOne.setOnClickListener(this);
   btTwo.setOnClickListener(this);
   btThree.setOnClickListener(this);
   btFour.setOnClickListener(this);
   btFive.setOnClickListener(this);
   btSix.setOnClickListener(this);
   btSeven.setOnClickListener(this);
   btEight.setOnClickListener  (this);
   btNine.setOnClickListener(this);
   btZero.setOnClickListener(this);
   btPlus.setOnClickListener(this);
   btMinus.setOnClickListener(this);
   btMulti.setOnClickListener(this);
   btDiv.setOnClickListener(this);
   btClear.setOnClickListener(this);
   btEqual.setOnClickListener(this);

//оголошуємо змінні
   operand1 = 0;
   operand2 = 0;
   result = 0;
   flagAction = 0;

// Встановимо значення першого операнда в текстове поле
   tvLCD.setText(Integer.toString(operand1));
}

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

@Override
public boolean onOptionsItemSelected(MenuItem item) {
   switch(item.getItemId()){
   case R.id.options_menu:
      Toast.makeText(this, R.string.options, Toast.LENGTH_LONG).show();
   break;
   case R.id.about_menu>:
      Toast.makeText(this, R.string.about_app, Toast.LENGTH_LONG).show();
   break;
}
   return super.onOptionsItemSelected(item);
}

@Override
public void onClick(View v) {
   switch(v.getId()){
   case R.id.btOne>:
   ClickNumber(1);
   break;
   case R.id.btTwo>:
   ClickNumber(2);
   break;
   case R.id.btThree:
   ClickNumber(3);
   break;
   case R.id.btFour:
   ClickNumber(4);
   break;
   case R.id.btFive:
   ClickNumber(5);
   break;
   case R.id.btSix>:
   ClickNumber(6);
   break;
   case R.id.btSeven:
   ClickNumber(7);
   break;
   case R.id.btEight:
   ClickNumber(8);
   break;
   case R.id.btNine:
   ClickNumber(9);
   break;
   case R.id.btZero:
   ClickNumber(0);
   break;
   case R.id.btPlus:
   if(flagAction == 0)flagAction = 1;
   break;
   case R.id.btMinus:
   if(flagAction == 0)flagAction = 2;
   break;
   case R.id.btMulti:
   if(flagAction == 0)flagAction = 3;
   break;
   case R.id.btDiv:
   if(flagAction == 0)flagAction = 4;
   break;
   case R.id.btEqual:
   switch(flagAction){
   case 1:
      result = operand1 + operand2;
   break;
   case 2:
      result = operand1 - operand2;
   break;
   case 3:
      result = operand1 * operand2;
   break;
   case 4:
      result =(double) operand1 / (double) operand2;
   break;
   default:
      Toast.makeText(this, "Операцію не задано", Toast.LENGTH_LONG);
}

if(flagAction != 0){
   tvLCD.setText(Double.toString(result));
   operand1 = 0;
   operand2 = 0;
   result = 0;
   flagAction = 0;
}
   break;
   case R.id.btClear:
   operand1 = 0;
   operand2 = 0;
   result = 0;
   flagAction = 0;
   tvLCD.setText(Integer.toString(operand1));
   break;
  }
}

private void ClickNumber(int num){
if(flagAction == 0){
   operand1 = operand1*10 + num;
   tvLCD.setText(Integer.toString(operand1));
}else{
   operand2 = operand2*10 + num;
   tvLCD.setText(Integer.toString(operand2));
   }
 }
}