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

Урок 4. Створюємо екран “Про додаток”.

Для того щоб пункти меню працювали як потрібно нам, необхідно спочатку створити activity, які будуть відкриватися при натисканні на пункти.

Спочатку створимо activity “Про програму”. Для цього правою кнопкою натискаємо на назву пакету у дереві нашого проекту (згадайте перший урок – ми його ставили при створенні проекту – ru.urok.super_calc), вибираємо New-> Class. Заповнюємо ім’я створюваного класу – AboutActivity. Також нам потрібно задати суперклас, тобто клас на основі якого ми створюємо AboutActivity. Натискаємо кнопку browse в рядку superclass, набираємо в рядку choose a type – “activity”. Нижче нам будуть запропоновані всі класи, які містять в своєму імені “activity”. Ми потрібен самий верхній – звичайний Activity. Вибираємо його, тиснемо ОК. Повинно бути як на першому малюнку.

Потім тиснемо Finish. Відкриється створений нами порожній клас:


package ru.urok.super_calc;
import android.app.Activity;

public class AboutActivity extends Activity {

}

В нього потрібно додати порожній метод onCreate:


public class AboutActivity extends Activity {

@Override
protected void onCreate(Bundle savedInstanceState) {
   super.onCreate(savedInstanceState);
   }
}

Порожнє activity готове. Щоб система знала про його існування потрібно зареєструвати його в AndroidManifest.xml. Цей файл система зчитує в першу чергу при відкритті apk-файлу. І якщо при виклику будь-якого activity записи про нього не виявиться в маніфесті, система видасть помилку.

Відкриваємо AndroidManifest.xml. Він лежить в корені проекту. Переходимо на вкладку Application. Там вже є запис про головну activity (головна activity реєструється автоматично при створенні проекту). Натискаємо Add, вибираємо Activity. Потім в рядку Name натискаємо кнопку browse і вибираємо зі списку AboutActivity. Зберігаємо. Activity зареєстровано. Все це можна було зробити на вкладці AndroidManifest.xml вручну. Якщо порівняти xml-код до виконаних операцій і після, то можна побачити новий рядок:


   <Activity android: name = "AboutActivity"> </ activity>

Тепер переходимо на MainActivity.java і в обробнику пункту меню “Про програму” замінимо рядок виводу повідомлення на рядок виклику AboutActivity:


startActivity (new Intent (this, AboutActivity.class));

Тобто метод onOptionsItemSelected тепер повинен виглядати так:


@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:
      startActivity(new Intent(this, AboutActivity.class));
      break;
   }
   return super.onOptionsItemSelected(item);
}

Запустимо програму на емуляторі і натиснемо пункт меню “Про додаток”. Відкриється порожній екран. Все правильно. Щоб на екрані щось було, потрібно створити макет екрану і дати команду activity його відобразити.

Правою кнопкою натискаємо на папці res \ layout. Вибираємо New-> Android XML File. Задаємо ім’я файлу about_calc. Нижче ви можете задати кореневий елемент, залишаємо за замовчуванням. Натискаємо Finish.

Розміщуємо в кореневому елементі два TextView і один Button. Оскільки в майбутньому розраховуємо додати в додаток ще локалізацію, для текстів знову будемо використовувати рядкові константи з string.xml:


   <String name = "text_about"> Калькулятор - програма створена спеціально для групи </ string>
   <String name = "vk_link"> Android developer </ string>
   <String name = "bt_good"> Добре </ string>

Прикріпимо їх до відповідних елементів на макеті в параметрі text. Зробіть друге текстове поле клікабельним – при кліці на нього в браузері буде відкриватися стіна групи Android developer. Але цього разу поставимо методи обробки натискань на текстове поле і кнопку відразу в макеті. Це робиться заданням імені методу в параметрі onClick елемента. Ось що у нас вийде:


<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
   android:layout_width="match_parent"
   android:layout_height="match_parent"
   android:orientation="vertical" >
<TextView
   android:id="@+id/textView1"
   android:layout_width="match_parent"
   android:layout_height="wrap_content"
   android:layout_weight="1"
   android:gravity="center_horizontal"
   android:text="@string/text_about" />
<TextView
   android:id="@+id/textView2"
   android:layout_width="match_parent"
   android:layout_height="wrap_content"
   android:layout_weight="1"
   android:gravity="center_horizontal"
   android:clickable="true"
   android:onClick="onLink"
   android:text="@string/vk_link"
   android:textColor="#111199" />
<Button
   android:id="@+id/button1"
   android:layout_width="match_parent"
   android:layout_height="wrap_content"
   android:text="@string/bt_good"
   android:onClick="onGood" />
</LinearLayout>

Я додав трохи форматування в макет, щоб елементи виглядали організовано і пофарбував текст посилання синім. І ще, мало не забув, щоб текстове поле було клікабельним потрібно встановити його параметр clickable в true. Макет готовий.

У AboutActivity.java пов’язуємо activity з макетом, а також додаємо два методи для обробки натискань. Зауважте назви методів повинні відповідати зазначеним в макеті.


public class AboutActivity extends Activity {
@Override
   protected void onCreate(Bundle savedInstanceState) {
      super.onCreate(savedInstanceState);
         setContentView(R.layout.about_calc);
         }
   public void onLink(View v){
}

   public void onGood(View v){
   }
}

Можна запустити на емуляторі, подивитися на отримане activity. Взагалі, рекомендую частіше запускати програму під час розробки – так легше відловити грубі помилки.

Тепер додаємо код для обробників натискань. onGood буде просто закривати activity. Тут все просто – пишемо finish (); і все. Для текстового поля пишемо такий код:


   Intent intent = new Intent (Intent.ACTION_VIEW);
   intent.setData (Uri.parse ( "http://vk.com/amdroid.developer"));
   startActivity (intent);

Тепер при натисканні на посилання, система запитає яким браузером її відкрити. Ну це якщо встановлено кілька браузерів, якщо тільки один або який-небудь браузер встановлений за замовчуванням в системі, то відкриється в ньому. Запускаємо на емуляторі, тестуємо.

У наступному уроці зробимо вікно налаштувань.

Лістинг (MainActivity.java не наводжу – там зміна в одному рядку, в string.xml думаю теж не складно розібратися, about_calc.xml повністю є вище):
AboutActivity.java


package ru.urok.super_calc;
import android.app.Activity;
import android.content.Intent;
import android.net.Uri;
import android.os.Bundle;
import android.view.View;
public class AboutActivity extends Activity {

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

public void onLink(View v){
   Intent intent = new Intent(Intent.ACTION_VIEW);
   intent.setData(Uri.parse("http://vk.com/amdroid.developer"));
   startActivity(intent);
}

public void onGood(View v){
   finish();
   }
}

AndroidManifest.xml


<?xml version="1.0" encoding="utf-8"?>
   <manifest xmlns:android="http://schemas.android.com/apk/res/android"
   package="ru.urok.super_calc"
      android:versionCode="1"
      android:versionName="1.0" >
   <uses-sdk
      android:minSdkVersion="14"
      android:targetSdkVersion="14" />
  <application
      android:allowBackup="true"
      android:icon="@drawable/ic_launcher"
      android:label="@string/app_name"
      android:theme="@style/AppTheme" >
  <activity
      android:name=".MainActivity"
      android:label="@string/app_name" >
  <intent-filter>
  <action android:name="android.intent.action.MAIN" />
  <category android:name="android.intent.category.LAUNCHER" />
  </intent-filter>
  </activity>
  <activity android:name="AboutActivity"></activity>
  </application>
  </manifest>