Воскресенье, 24.06.2018, 04:14
Поиск
Никнэйм
Сертификат на никнейм Olelucoye, зарегистрирован на Тимофеев Константин Михайлович
Зарегистрируй свой никнейм
Обратная связь
olelucoye.tk@yandex.ru
Реклама AdSense
Реклама
Друзья сайта
  • Лига медицинского права
  • Гостиница "Зай"
  • FAQ по системе
  • Инструкции для uCoz
  • Главная » Статьи » Андроид разработка

    Программируем калькулятор на андроид. Урок 5.

    Урок сделан специально для группы http://vk.com/amdroid.developer

    Урок 5. Создаем экран настроек.

    Экран настроек можно было бы сделать аналогично экрану "О приложении". Тогда пришлось бы самим писать код обработки кликов, сохранения настроек и т.п. Но мы будем использовать специальный класс PreferenceActivity. Он сильно облегчает жизнь разработчика при работе с настройками приложения.

    Итак, создаем новый класс PrefActivity так же как в уроке 4, но в строке суперкласс указываем PreferenceActivity.  Создаем метод onCreate:

           @Override

             protected void onCreate(Bundle savedInstanceState) {

               super.onCreate(savedInstanceState);

             }

    Теперь нам нужно создать макет экрана настроек. Делается он так: правой кнопкой кликаем папку res и создаем новую папку с именем "xml". В этой папке мы создаем Android XML File. В строке Resource Type выбираем Preference, корневой элемент указываем PreferenceScreen. Задаем имя файла pref_screen.

    Теперь нам нужно описать элементы на экране. Разместим на экране чекбокс для включения дополнительных кнопок и список для выбора стиля интерфейса калькулятора.

    Для этого пишем в pref_screen.xml:

           <CheckBoxPreference

                 android:key="add_button"

                 android:summary="@string/descr_add_bt"

                 android:title="@string/add_bt">

           </CheckBoxPreference>

           <ListPreference

                 android:entries="@array/style_entries"

                 android:entryValues="@array/style_entry_values"

                 android:key="style_calc"

                 android:summary="@string/descr_style_app"

                 android:title="@string/style_app">

           </ListPreference>

    Рассмотрим параметры: key - это ключ, имя по которому в коде мы будем определять состояние настройки, title - заголовок, который мы увидим в поле настройки, summary - текст-пояснение, расположенный ниже заголовка. Для ListPreference есть еще два параметра: entries - текст списка, который мы увидим на экране, entryValues - значения, которые будет принимать key, при нажатии того или иного пункта списка. Заметьте все параметры задаются строковыми константами (из-за тех же соображений, что и раньше - в расчете на будущую дополнительную локазацию). Смотрим что нового добавляем в string.xml:

        <string name="add_bt">Дополнительные кнопки</string>

        <string name="descr_add_bt">Показать дополнительные кнопки</string>

        <string name="style_app">Стиль программы</string>

        <string name="descr_style_app">Изменить стиль интерфейса</string>

        <string-array name="style_entries">

                 <item>Стиль 1</item>

                 <item>Стиль 2</item>      

        </string-array>

        <string-array name="style_entry_values">

                 <item>1</item>

                 <item>2</item>

        </string-array>

    Обратите внимание, как задаются массивы строковых констант.

    Осталось указать PreferenceActivity какой макет показать на экране. Пишем в onCreate:

    addPreferencesFromResource(R.xml.pref_screen);

    Экран настроек готов. Переходим в MainActivity.java и в обработчике нажатия на пункт меню "Настройки" заменяем вывод сообщения на вызов активити:

           @Override

           public boolean onOptionsItemSelected(MenuItem item) {

                 switch(item.getItemId()){

                 case R.id.options_menu:

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

                        break;

    Не забываем зарегистрировать PreferenceActivity в манифесте (делается также как с обычным активити - см. урок 4).

    Запускаем приложение, вызываем экран настроек, тычем по пунктам.

    Следующим шагом нам нужно получить данные настроек в основной активити. Открываем MainActivity.java. Объявляем объект SharedPreferences и две переменные для получения настроек до onCreate:

           SharedPreferences sp;

           Boolean add_button;

           String style_calc;

    Для удобства имена переменных задал такие же как у ключей в макете настроек. В onCreate получаем SharedPreferences, которое работает с файлом настроек:

    sp = PreferenceManager.getDefaultSharedPreferences(this);

    Теперь нам нужно добавить метод onResume, который вызывается системой, когда активити получает фокус, т.е когда мы возвращаем его на экран. В нем мы будем получать настройки из SharedPreferences.

             protected void onResume() {

               add_button = sp.getBoolean("add_button", false);

               style_calc = sp.getString("style_calc", "1");

               super.onResume();

             }

    Настройки получены. Теперь их нужно как то применить. Стиль мы пока применить не можем. Для этого еще нужно много сделать. Оставим его в покое до урока, в котором будем делать интерфейс презентабельным. Займемся отображением дополнительных кнопок. Для начала их нужно добавить на макет activity_main.xml. Добавляем горизонтальный layout и четыре кнопки в него:

           <LinearLayout

                android:id="@+id/llExtra"

                android:layout_width="match_parent"

                android:layout_height="wrap_content">

                <Button

                    android:id="@+id/btPoint"

                    android:layout_width="wrap_content"

                    android:layout_height="wrap_content"

                    android:layout_weight="1"

                    android:text="." />

                <Button

                    android:id="@+id/btSquare"

                    android:layout_width="wrap_content"

                    android:layout_height="wrap_content"

                    android:layout_weight="1"

                    android:text="x*x" />

                <Button

                    android:id="@+id/btRadical"

                    android:layout_width="wrap_content"

                    android:layout_height="wrap_content"

                    android:layout_weight="1"

                    android:text="√" />

                <Button

                    android:id="@+id/btBack"

                    android:layout_width="wrap_content"

                    android:layout_height="wrap_content"

                    android:layout_weight="1"

                    android:text="←" />

            </LinearLayout>

    Обратите внимание, что layout тоже получил параметр id.

    Возвращаемся к MainActivity.java. Объявляем объект LinearLayout, связываем его с layout'ом на макете. В onResume добавляем код:

               int flag_visiblity = View.INVISIBLE;

               if(add_button)flag_visiblity = View.VISIBLE;

               llExtra.setVisibility(flag_visiblity);

    Т.к. метод setVisiblity требует на вход параметр типа int, а мы получаем из настроек булеву переменную, пришлось ввести промежуточный флаг flag_visiblity и в зависимости от значения add_button присваивать ему то или иное целочисленное значение.

    Запускаем приложение, тестируем. Обработку нажатий новых кнопок будем кодить в одном из следующих уроков. Этот урок закончен.

    Программируем калькулятор на андроид. Урок 10.

    Программируем калькулятор на андроид. Урок 9.

    Программируем калькулятор на андроид. Урок 8.

    Программируем калькулятор на андроид. Урок 7.

    Программируем калькулятор на андроид. Урок 6.

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

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

    Программируем калькулятор на андроид. Урок 2.

    Программируем калькулятор на андроид. Урок 1.

    Приложение сильно обросло кодом. Поэтому приведу листинги только экрана настроек и MainActivity.java. С остальными файлами думаю разберетесь сами. В следующем уроке попробуем немного оптимизировать код - уменьшить громоздкость и улучшить читабельность.

    pref_screen.xml

    <?xml version="1.0" encoding="utf-8"?>

    <PreferenceScreen xmlns:android="http://schemas.android.com/apk/res/android" >

        <CheckBoxPreference

                 android:key="add_button"

                 android:summary="@string/descr_add_bt"

                 android:title="@string/add_bt">

           </CheckBoxPreference>

           <ListPreference

                 android:entries="@array/style_entries"

                 android:entryValues="@array/style_entry_values"

                 android:key="style_calc"

                 android:summary="@string/descr_style_app"

                 android:title="@string/style_app">

           </ListPreference>

    </PreferenceScreen>

     

    PrefActivity.java

    package ru.urok.super_calc;

    import android.os.Bundle;

    import android.preference.PreferenceActivity;

    public class PrefActivity extends PreferenceActivity {

            @Override

             protected void onCreate(Bundle savedInstanceState) {

               super.onCreate(savedInstanceState);

               addPreferencesFromResource(R.xml.pref_screen);

           }

    }

     

    MainActivity.java

    package ru.urok.super_calc;

    import android.app.Activity;

    import android.content.Intent;

    import android.content.SharedPreferences;

    import android.os.Bundle;

    import android.preference.PreferenceManager;

    import android.view.Menu;

    import android.view.MenuItem;

    import android.view.View;

    import android.view.View.OnClickListener;

    import android.widget.Button;

    import android.widget.LinearLayout;

    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;

           SharedPreferences sp;

           Boolean add_button;

           String style_calc;

           LinearLayout llExtra;

          @Override

           protected void onCreate(Bundle savedInstanceState) {

                 super.onCreate(savedInstanceState);

                 setContentView(R.layout.activity_main);

                 sp = PreferenceManager.getDefaultSharedPreferences(this);

                 llExtra = (LinearLayout) findViewById(R.id.llExtra);

                 //связываем кнопки с макетом

                 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));

            }

          

           protected void onResume() {

               add_button = sp.getBoolean("add_button", false);

               style_calc = sp.getString("style_calc", "1");

               int flag_visiblity = View.INVISIBLE;

               if(add_button)flag_visiblity = View.VISIBLE;

               llExtra.setVisibility(flag_visiblity);

               super.onResume();

             }

           @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:

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

                        break;

                 case R.id.about_menu:

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

                        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));

                 }

           }

    }

    Категория: Андроид разработка | Добавил: Olelucoye (25.11.2014)
    Просмотров: 9456
    | Теги: экран настроек, Калькулятор, java, Android | Рейтинг: 0.0/0
    Всего комментариев: 0
    Добавлять комментарии могут только зарегистрированные пользователи.
    [ Регистрация | Вход ]
    Меню сайта
    Категории раздела
    Андроид разработка [23]
    libGDX [24]
    Мои андроид проекты [6]
    Excel [7]
    Железяки [5]
    Скрипты в блокноте [4]
    Разное [1]
    Форма входа
    Статистика

    Онлайн всего: 1
    Гостей: 1
    Пользователей: 0
    Яндекс Метрика
    Яндекс.Метрика