Инструменты подписания приложений Android

В данном посте рассмотрим 2 инструмента, которые будут необходимы для подписания приложений на Android. Первым рассмотрим встроенный Wizard в Android Studio, а во втором — консольный вариант этого приложения, поставляемый в составе JDK.

Прежде, чем рассмотреть инструменты необходимо понять принцип работы электронной подписи. В процессе подписи приложения участвуют 3 элемента:

  • открытый ключ — доступен всем. Используется для шифрования данных;
  • закрытый ключ — доступен только владельцу приложения. Используется для расщифрования данных;
  • сертификат подписи — нужен для защиты данных пользователей и идентификации приложения в сети. Это электронный документ, который содержит информацию о владельце приложения —  имя, название домена, адрес, юридические данные (если доменом владеет организация).

Встроенный инструмент разработки Android Studio

Чтобы соз

 

Часть 1. Push — уведомления для Android и iOS при помощи Firebase Cloud Messages

 

Это простой прямой подход, касающийся того, как реализовать push-уведомление в Android, а также iOS, используя плагин  cordova plugin for fcm для проекта Cordova и Google Firebase FCM в виде облачного сервера обработки сообщений.

Использование FCM в платформе Android

1. Создание проекта Cordova. Сначала необходимо иметь какой-то проект Cordova с добавленной платформой Android:

cordova create pushSample
cd pushSample
cordova platform add android

далее к этому проекту мы добавляем плагин cordova-plugin-fcm командой:

cordova plugin add cordova-plugin-fcm

В процессе установки данного плагина система нам выведет ряд ошибок, к примеру, скажет, что у нас отсутствует файл google-services.json:

Error: cordova-plugin-fcm: You have installed platform android but file 'google-services.json' was not found in your Cordova project root folder.
Note : This is because we have not added the google-services.json file which has to be created in the next following steps.

данный файл мы должны скачать из консоли Google Firebase в процессе создания приложения и находиться он должен в корневой директории проекта Cordova.

2. Создание облачного проекта Firebase. В консоли google firebse console жмем на кнопку «Добавить» и создаем новое облачный проект для Android, iOS и WEB — проектов:

После нажатия на кнопку «Создать проект» следующим шагом является добавление возможности создания облачных уведомлений через Firebase Cloud Messages и для этого необходимо нажать на пункту «Notifications» и далее следующее окно предложит ввести данные приложения для Android или iOS:

На данном этапе нажимаем на Android и заполняем данные и выйдет окно, требующий заполнения уникального идентификатора:

далее жмем на кнопку «Зарегистрировать приложение» и мы попадем на шаг, где нам предлагают скачать вышеупомянутый файл google-services.json:

данный файл скачиваем и кидаем в корень проекта Cordova pushSample/google-service.json.

Далее жмем «Продолжить» и сервис предложит нам добавить некоторый код в файл сборки build.gradle, который находится в корне платформы Android по пути pushSample/platforms/android/build.gradle:

buildscript {
  dependencies {
    // Add this line
    classpath 'com.google.gms:google-services:3.2.0'
  }
}

В скрипте сборки плагина по пути pushSample/platforms/android/cordova-plugin-fcm/pushSample-FCMPlugin.gradle :

dependencies {
  // Add this line
  compile 'com.google.firebase:firebase-core:11.8.0'
}
...
// Add to the bottom of the file
apply plugin: 'com.google.gms.google-services'

В некоторых случаях выше приведенный код может выдавать ошибки и несоответствия и все это выйдет в консоль, как например ниже:

google-services plugin could not detect any version for com.google.android.gms or com.google.firebase, default version: 9.0.0 will be used.
please apply google-services plugin at the bottom of the build file.

Для решения можно написать костыли принудительного исполнения, прописав их в файл pushSample/platforms/android/build.gradle:

...

allprojects {
    repositories {
        ...
        configurations.all {
            resolutionStrategy {
                // Add force (11.4.0 is version you want to use)
                force 'com.google.firebase:firebase-messaging:11.4.0'
                force 'com.google.firebase:firebase-core:11.4.0'
                force 'com.google.android.gms:play-services-gcm:11.4.0'
            }
        }
    }
}

...

3. Пишем первое уведомление. После добавления кода построения сервисов Google облачный проект предложит нам отправить сообщение:

Перед тем, как написать новое сообщение из консоли в клиентские приложения в виде уведомлений необходимо сначала написать клиентский код, который будет их принимать. Для этого в папке скриптов создаем новый файл www/scripts/script.fcm.js, в котором будем писать код, выполняемый после инициализации всех ресурсов Cordova:

var app = {
    initialize: function() {
        this.setup();
    },
    bindEvents: function() {
        document.addEventListener('deviceready', this.onDeviceReady, false);
    },
    onDeviceReady: function() {
        app.receivedEvent('deviceready');
    },
    receivedEvent: function(id) {
        console.log('Received Event: ' + id);
    },
    setup: function() {  
        //***********Начало кода FCM
        //Функция обработки всех уведомлений, как в бакграунде, так и при открытом приложении
        FCMPlugin.getToken(function(token) {
            //this is the fcm token which can be used
            //to send notification to specific device 
            console.log(token);
            //FCMPlugin.onNotification( onNotificationCallback(data), successCallback(msg), errorCallback(err) )
            //Here you define your application behaviour based on the notification data.
            FCMPlugin.onNotification(function(data) {
                console.log(data);
                //data.wasTapped == true means in Background :  Notification was received on device tray and tapped by the user.
                //data.wasTapped == false means in foreground :  Notification was received in foreground. Maybe the user needs to be notified.
                if (data.wasTapped) {
                     //Notification was received on device tray and tapped by the user.
                     alert(JSON.stringify(data));
                 } else {
                     //Notification was received in foreground. Maybe the user needs to be notified.
                     alert(JSON.stringify(data));
                 }
            });
        });
        //************Конец кода FCM
    }
};

app.initialize();

Данный файл подключаем ко всем необходимым страницам нашего проекта Cordova. построим приложение и запустим на эмулятор или на реальное устройство:

cordova build android
cordova run android

И далее и консоли отправляем наше первое уведомление:

жмем на «Отправить сообщение» и ждем его в приложении в виде уведомления, причем, приложение может быть закрыто и уведомление все равно придет и будет видно в верхней части экрана устройства или эмулятора:

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

 

Ошибки построения Android приложения в проекте на Cordova

Есть 2 самые распространенные виды ошибок, которые возможны при построении приложения Android в проекте Cordova:

  • первое — несоответствие версии платформы и версий плагинов Cordova:
Failed to execute aapt
com.android.ide.common.process.ProcessException: Failed to execute aapt
  • второе — отсутствие кода Gradle для импорта дополнительных сервисов. Это может выглядеть так:
google-services plugin could not detect any version for com.google.android.gms or com.google.firebase, default version: 9.0.0 will be used.
please apply google-services plugin at the bottom of the build file.
  1. Возможное решение первой ошибки — принудительное указание версии добавлением в конец файла android/build.gradle:
configurations.all {
    resolutionStrategy {
        force 'com.android.support:support-v4:27.1.0'
    }
}

2. Возможное решение второй ошибки android/build.gradle:

allprojects {
    repositories {
        ...
        configurations.all {
            resolutionStrategy {
                // Add force (11.4.0 is version you want to use)
                force 'com.google.firebase:firebase-messaging:11.4.0'
                force 'com.google.firebase:firebase-core:11.4.0'
                force 'com.google.android.gms:play-services-gcm:11.4.0'
            }
        }
    }
}

 

Запуск программы Android на Windows через командную строку

Есть моменты, когда нет необходимости использовать IDE Android Studio для запуска скачанного или построенного на компьютере apk-файла и нужно быстро проверить его работоспособность запустив на подключенном через USB устройстве либо на эмуляторе, поставляемый с Android Studio SDK. Для этого, нам необходимо, в первую очередь, выполнить следующие шаги:

  1. Установить Android Studio с SDK;
  2. Добавить в переменную path путь до папки C:\Users\WebSofter\AppData\Local\Android\sdk\tools;
  3. Добавить в переменную path путь до папки C:\Users\WebSofter\AppData\Local\Android\sdk\platform-tools.

Далее нам будут доступны из командной строки 2 команды:

  1. adb — общая команда разработки пакета SDK;
  2. emulator — команда работы с виртуальными эмуляторами.

 

1. Установка Android apk -файла на реальное устройство

Сперва нам нужно подключить мобильное устройство к компьютеру через USB и через команду в CMD

adb devices

Получим весь набор подключенных, на данный момент, устройств.

Причем, виртуальные запущенные устройство и реальные, подключенные через USB определяются одинаково.

Теперь, чтобы установить на определенное устройство из списка apk-файл, нам необходимо ввести ключ установки, путь до apk и название устройства из списка. В данном случае, команда будет такая

adb -s 44bb94b57d82 install employee-directory.apk

После этой команды в командной строке будет сообщение об удачной установке на ваше Android-устройство

А в самом устройстве будет уже установленное apk-приложение.

Если в списке устрйоств вист только одно устройство , то можно укорочить команду

adb install path_to_apk

Дополнительная информация по команде adb будет по ссылке на официальном ресурсе https://developer.android.com/studio/command-line/adb.html

2. Установка Android apk -файла на виртуальное устройство

Перед установкой нам необходимо отключить аппаратную виртуализацию. Это требование Android Studio для удачного запуска своего эмулятора

Для этого, выполняем в командной строке команду

bcdedit /set hypervisorlaunchtype off

После этого перезапускаем компьютер и идем дальше.

Для начала посмотрим список доступных для нас виртуальных эмуляторов в системе. Для этого в командной строке выполняем команду

emulator -list-avds

Это вернет нам список уже созданных или существующих по умолчанию эмуляторов

Запустим первый в списке эмулятор под названием Phone через команду

Тут очень важный момент, возможно, что это связано с внутренним багом Android SDK, но, если запустить команду emulator вне директории C:\Users\WebSofter\AppData\Local\Android\sdk\emulator\, то есть возможность получить ошибку на подобие

C:\Users\WebSofter>emulator -avd Phone
[3420]:ERROR:android/android-emu/android/qt/qt_setup.cpp:28:Qt library not found at ..\emulator\lib64\qt\lib
Could not launch 'C:\Users\WebSofter\..\emulator\qemu\windows-x86_64\qemu-system-i386.exe': No such file or directory

Это произойдет, даже если мы добавили этот путь в переменную path, поэтому, чтобы запустить эту команду в штатном режиме надо зайти в папку C:\Users\WebSofter\AppData\Local\Android\sdk\emulator\ и там ее выполнить.

emulator -avd Phone

После данной команды запуститься процесс выполнения запуска эмулятора

А на экране вы увидите запущенный эмулятор

Чтобы запустить эмулятор в автономном режиме, при котором он бы не закончил работу после выхода из CMD можно выполнить команду

start emulator.exe -avd Phone

Теперь, когда мы смогли запустить наш виртуальный эмулятор, то давайте еще подключим через USB и реальное устройство и попытаемся вывести в список их в виде доступных для запуска приложений устройств через команду

adb devices

Это у нас выведет список всех устройств, на которые можно установить apk файл

Так как на реальном устройстве 44bb94b57d82 мы уже проверяли установку в первой части статьи, то на этот раз установим apk — файл на эмулятор emulator-5554 командой

adb -s emulator-5554 install employee-directory.apk

В итоге, программа установится на эмулятор

и можем найти в списке установленных программ

и запустить

На этом все.

 

 

Решение проблем с запуском Visual Studio Emulators for Android

Прежде, чем воспользоваться решениями из этой статьи следует учесть, что это не полноценные решения, так как эмуляторы Android в составе Visual Studio — это довольно глючные ПО и баги могут быть совсем иного характера, начиная от проблем с виртуализацей вашего ПК и кончая с глюками и конфликтами самих эмуляторов.

1. Ошибка отключенной виртуализации

Первая проблема, которая может возникнуть, это проблема, связанная с включением виртуализации в BIOS с ошибкой запуска:

Exit Code: HypervisorNotRunning when running Visual studio android emulator

Чтобы исправить эту ошибку необходимо удостовериться, что процессор поддерживает аппаратную виртуализацию и далее запустить командную строку с правами администратора. Запустив необходимо выполнить код включения аппаратной виртуализации:

bcdedit /set hypervisorlaunchtype auto

И перезапускаем систему Windows и пробуем.

2. Ошибка нехватки памяти

Данная ошибка связана с нехваткой оперативной памяти и сопровождается таким диалогом

Эмулятору не удалось проверить, работает ли виртуальная машина: 
В системе не хватает памяти, чтобы запустить эмулятор, занимающий 
2048 МБ оперативной памяти для запуска. Закройте другие приложения 
и запустите эмулятор повторно. Если это не помогает, следуйте 
инструкциям в следующей статье базы знаний: 
https://support.microsoft.com/en-us/help/2911380/-not-enough-memory-error-message-and-windows-phone-8-emulator-does-not

Для решения переходим по данной статье, где говорится, что необходимо редактировать параметр MemoryReserve ветки реестра на элементе HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Virtualization  . Т.е. для начала запускаем редактор реестра командой Win + R, введя команду regedit

Далее находим нужную ветку

 

По умолчанию этот параметр равен 2048 МБ, поэтому уменьшаем данный параметр до такого, чтобы эмулятор мог удачно запускаться и можно было в нем работать.

И перезапускаем систему Windows и пробуем.

Add Fragment as content to Activity in Android

Today we try add Fragment layout in another Activity layout, that reduce  complexity develop user interface. For this example we need 3 layout: main.xml, fragment1.xml, fragment2.xml, and 3 classes: MainActivity.java, Fragment1.java, Fragment2.java

Code of xml layouts

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:id="@+id/LinearLayout1"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="horizontal"    >
</LinearLayout>
<?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="fill_parent"
        android:layout_height="fill_parent"
        android:text="I m fragment ONE"
        android:gravity="center"
        android:background="#5eff6a"
        android:textAppearance="?android:attr/textAppearanceLarge" />

</LinearLayout>
<?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="fill_parent"
        android:layout_height="fill_parent"
        android:text="I m fragment ONE"
        android:gravity="center"
        android:background="#5eff6a"
        android:textAppearance="?android:attr/textAppearanceLarge" />

</LinearLayout>

 

Code of Java — classes

package com.example.dynamicfragments;

import android.support.v7.app.ActionBarActivity;
import android.app.Fragment;
import android.app.FragmentManager;
import android.app.FragmentTransaction;
import android.os.Bundle;
import android.view.Display;
import android.view.Menu;
import android.view.MenuItem;
import android.view.WindowManager;

public class MainActivity extends ActionBarActivity {

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

		FragmentManager fm = getFragmentManager();
		FragmentTransaction fragmentTransaction = fm.beginTransaction();

		// get the display mode
		int displaymode = getResources().getConfiguration().orientation;
		if (displaymode == 1) { // it portrait mode
			Fragment1 f1 = new Fragment1();
			fragmentTransaction.replace(android.R.id.content, f1);
		} else {// its landscape
			Fragment2 f2 = new Fragment2();
			fragmentTransaction.replace(android.R.id.content, f2);
		}
		fragmentTransaction.commit();

	}
}

 

package com.example.dynamicfragments;

import android.app.Fragment;
import android.os.Bundle;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;

public class Fragment1 extends Fragment {
	public View onCreateView(LayoutInflater inflater, ViewGroup vg,
			Bundle savedInstanceState) {
		return inflater.inflate(R.layout.fragment1, vg, false);
	}
}

 

package com.example.dynamicfragments;

import android.app.Fragment;
import android.os.Bundle;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;

public class Fragment2 extends Fragment {
	public View onCreateView(LayoutInflater inflater, ViewGroup vg,
			Bundle savedInstanceState) {
		return inflater.inflate(R.layout.fragment2, vg, false);
	}
}

 

Conclusion result for this example

Create sliding menu-panel for android in fragment-layout

Hi All! In this post i am want to show you how to create android sliding panel for menu or content. This menu by founded on TranslateAnimation class.

For this we need one layout file bellow

XML code for this layout is shown bellow

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:id="@+id/RelativeLayout1"
    android:layout_width="fill_parent"
    android:layout_height="fill_parent"
    android:orientation="vertical" >

    <SurfaceView
        android:id="@+id/surfaceView1"
        android:layout_width="fill_parent"
        android:layout_height="fill_parent" />

    <RelativeLayout
        android:id="@+id/rlContentSliding"
        android:layout_width="220dp"
        android:layout_height="fill_parent"
        android:background="#BBB"
        android:orientation="vertical" >

        <LinearLayout
            android:id="@+id/llFakeLayout"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:orientation="vertical" android:visibility="gone">
        </LinearLayout>

        <ListView
            android:id="@+id/listView1"
            android:layout_width="match_parent"
            android:layout_height="wrap_content" >
        </ListView>
    </RelativeLayout>

    <RelativeLayout
        android:id="@+id/rlContentMain"
        android:layout_width="fill_parent"
        android:layout_height="fill_parent"
        android:background="#AfA"
        android:orientation="vertical">

        <LinearLayout
            android:id="@+id/llButtonLine"
            android:layout_width="fill_parent"
            android:layout_height="wrap_content"
            android:layout_alignParentLeft="true"
            android:layout_alignParentTop="true" android:background="#fff" android:layout_margin="2dp"
            android:weightSum="1">

            <Button
                android:id="@+id/button"
                android:layout_width="50dp"
                android:layout_height="wrap_content"
                android:text="slide"
                android:layout_weight="0.11" />
        </LinearLayout>

    </RelativeLayout>

</RelativeLayout>

Now we have to attach our layout as a fragment to the main Activity, adding events to the button in the method OnCreateView

public class SlideExampleFragment extends Fragment {
    View V;
    private Button buttonSwitch;
    private View subLayout;
    private View topLayout;
    private ListView subViewListView;
    private String listViewDummyContent[]={"Menu Item 1","Menu Item 2","Menu Item 3","Menu Item 2"};
    private Display display;
    private View fakeLayout;
    private Animation.AnimationListener AL;

    // Values for after the animation
    private int oldLeft;
    private int oldTop;
    private int newleft;
    private int newTop;
    private int screenWidth;
    private int animToPostion;
    // TODO change the name of the animToPostion for a better explanation.

    private boolean menuOpen = false;
    
    @Override
    public void onActivityCreated(@Nullable Bundle savedInstanceState) {
        super.onActivityCreated(savedInstanceState);
    }

    @Override
    public View onCreateView(LayoutInflater inflater, final ViewGroup container, Bundle savedInstanceState) {
        // Inflate the layout for this fragment

        V = inflater.inflate(R.layout.slide_layout, container, false);

        buttonSwitch = (Button)V.findViewById(R.id.button);
        subLayout = (View) V.findViewById(R.id.rlContentSliding);
        topLayout = (View) V.findViewById(R.id.rlContentMain);
        subViewListView=(ListView)V.findViewById(R.id.listView1);
        fakeLayout = (View)V.findViewById(R.id.llFakeLayout);

        subViewListView.setAdapter(new ArrayAdapter<String>(getActivity(),android.R.layout.simple_list_item_1 , listViewDummyContent));

        display =  getActivity().getWindowManager().getDefaultDisplay();
        screenWidth = display.getWidth();
        int calcAnimationPosition = (screenWidth /3);

        // Value where the onTop Layer has to animate
        // also the max width of the layout underneath
        // Set Layout params for subLayout according to calculation
        animToPostion = screenWidth - calcAnimationPosition;

        RelativeLayout.LayoutParams params = new RelativeLayout.LayoutParams(animToPostion, RelativeLayout.LayoutParams.FILL_PARENT);
        subLayout.setLayoutParams(params);

        topLayout.setOnTouchListener(new View.OnTouchListener() {

            @Override
            public boolean onTouch(View v, MotionEvent event) {

                if(event.getAction() == MotionEvent.ACTION_DOWN) {
                    if (menuOpen == true) {
                        animSlideLeft();
                    }
                }

                return false;
            }
        });

        buttonSwitch.setOnClickListener(new View.OnClickListener() {

            @Override
            public void onClick(View v) {
                if(menuOpen == false){
                    animSlideRight();
                } else if (menuOpen == true) {
                    animSlideLeft();
                }
            }
        });

        AL = new Animation.AnimationListener() {

            @Override
            public void onAnimationStart(Animation animation) {
                buttonSwitch.setClickable(false);
                topLayout.setEnabled(false);
            }
            @Override
            public void onAnimationRepeat(Animation animation) {
                // TODO Auto-generated method stub

            }
            @Override
            public void onAnimationEnd(Animation animation) {
                if(menuOpen == true) {
                    Log.d("", "Open");
                    topLayout.layout(oldLeft, oldTop, oldLeft + topLayout.getMeasuredWidth(), oldTop + topLayout.getMeasuredHeight() );
                    menuOpen = false;
                    buttonSwitch.setClickable(true);
                    topLayout.setEnabled(true);
                } else if(menuOpen == false) {
                    Log.d("","FALSE");
                    topLayout.layout(newleft, newTop, newleft + topLayout.getMeasuredWidth(), newTop + topLayout.getMeasuredHeight() );
                    topLayout.setEnabled(true);
                    menuOpen = true;
                    buttonSwitch.setClickable(true);
                }
            }
        };

        return V;
    }

    public void animSlideRight(){

        fakeLayout.setVisibility(View.VISIBLE);
        newleft = topLayout.getLeft() + animToPostion;
        newTop = topLayout.getTop();
        TranslateAnimation slideRight = new TranslateAnimation(0,newleft,0,0);
        slideRight.setDuration(500);
        slideRight.setFillEnabled(true);
        slideRight.setAnimationListener(AL);
        topLayout.startAnimation(slideRight);
    }

    public void animSlideLeft() {

        fakeLayout.setVisibility(View.GONE);
        oldLeft = topLayout.getLeft() - animToPostion;
        oldTop = topLayout.getTop();
        TranslateAnimation slideLeft = new TranslateAnimation(newleft,oldLeft,0,0);
        slideLeft.setDuration(500);
        slideLeft.setFillEnabled(true);
        slideLeft.setAnimationListener(AL);
        topLayout.startAnimation(slideLeft);
    }
}

End result for this post show bellow

Android. Интерфейс. Контролы. Spinner

Спиннеры предоставляют быстрый путь выборки одного значения из некоторого списка. По умолчанию, спиннер показывает выбранное текущее значение.

android-post-spinner-controll-photo

Нажимая на выпадающее меню спиннера можно выбрать один из доступных значений из списка.

Добавление контрола спиннера в интерфейс

Мы можем добавить спиннер в наш layout с объектом спиннера. Для этого необходимо добавить в интерфейс layout  контрол с тегом <Spinner>. К примеру:

<Spinner
    android:id="@+id/language_spinner"
    android:layout_width="fill_parent"
    android:layout_height="wrap_content" />

Для заполнения спиннера со списком выбора, нам необходимо определить класс SpinnerAdapter в нашем текущем коде Activity или Fragment.

Добавление данных в спиннер из strings.xml. Способ 1

Это самый предпочтительный способ заполнения текстовых данных для контролов, так как очень удобно и универсально, когда все данные хранятся в одном общедоступном файле. Чтобы загрузить строки в виде списка в спиннер необходимо определить массив данных в файле ресурсов strings.xml

<resources>
    <string-array name="language_array">
        <item>English</item>
        <item>Русский</item>
        <item>العربية</item>
    </string-array>
</resources>

Ниже приведен код активити в методе onCreate для чтения массива списка из string.xml

Spinner spinner = (Spinner) findViewById(R.id.language_spinner);
// Создаем ArrayAdapter, используя текстовый массив и spinner layout по умолчанию
ArrayAdapter<CharSequence> adapter = ArrayAdapter.createFromResource(this,
        R.array.language_array, android.R.layout.simple_spinner_item);
// Определяем layout, когда происходит выбор из списка
adapter.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item);
// устанавливаем адаптер к спиннеру
spinner.setAdapter(adapter);
// Заголовок по умолчанию
spinner.setPrompt("Language");
// Выбираем элемент по умолчанию
spinner.setSelection(1);

Элементы layout simple_spinner_item и simple_spinner_dropdown_item уже определены в системе, поэтому их можно установить без определения. Для пользовательского определения их нужно создать в папке ресурсов и прикрепить.

Добавление данных в спиннер из кода в виде массива. Способ 2

Второй способ — это прикрепление данных к спиннеру в виде списка из массива, который будет определен в коде. Ниже представлен код в методе onCreate

String[] data = {"English", "Русский", "لعربية"};
Spinner spinner = (Spinner) findViewById(R.id.language_spinner);
ArrayAdapter<String> adapter = new ArrayAdapter<String>(this,android.R.layout.simple_spinner_item, data);
// Определяем layout, когда происходит выбор из списка
adapter.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item);
// устанавливаем адаптер к спиннеру
spinner.setAdapter(adapter);
// Заголовок по умолчанию
spinner.setPrompt("Language");
// Выбираем элемент по умолчанию
spinner.setSelection(1);

Обработка событий от спиннера

Для обработки событий достаточно, в методе onCreate, ниже кода инициализации спинера переопределить метод объекта спиннера setOnItemSelectedListener

        spinner.setOnItemSelectedListener(new AdapterView.OnItemSelectedListener() {
            @Override
            public void onItemSelected(AdapterView<?> parent, View view,
                                       int position, long id) {
                //Показываем позиция нажатого элемента
                Toast.makeText(getBaseContext(), "Position = " + position, Toast.LENGTH_SHORT).show();
            }
            @Override
            public void onNothingSelected(AdapterView<?> arg0) {
            }
        });

 

Часть 1. Написание игры «Крестики и нолики» под Android. Подготовка инструментов

Итак, с сегодняшнего дня начнем цикл статей, которые пошагово разъяснять как написать свою собственную игру на примере классической игры «Крестики и нолики», другое забавное название для данной игры «Tic-Tac-Toe» 🙂  . Плюс ко всему этому попытаемся загрузить, после написания, на Google Play, чтобы игроманы смогли оценить наше детище 🙂 .

В данной части разъясним что нам необходимо для полноценной разработки игры:

  • Android Studio — полнофункциональный официальный инструмент разработки для кроссплатформенной разработки приложений для Android, который еще содержит и эмулятор для виртуального тестирования программ;
  • JDK — набор инструментов для разработки программ, работающих на Java. Наш инструмент Android Studio работает на основе Java машины, поэтому нам необходимо ее установить на компьютер, прежде чем устанавливать Android Studio;
  • Inkscape — векторный редактор для рисования наших ресурсов, таких как кнопки, иконки, фоны и т.д. Это необязательное условие, можете использовать другой, на котором набита рука.

1. Установка JDK

Установка JDK ничем не отличается от установки любой другой программы. Скачиваем отсюда и я не буду вдаваться в дебри установки, потому что нет никаких сложностей. Единственное, если у вас Windows, после установки откройте командную строку и введите команду

java -version

Если установка удачная, то должна вернуть версию программы

 

java-console-version-result

если это не так, то следует открыть «переменные среды» вашего компьютера

java-variable-java-home

 

и создать новую пременную JAVA_HOME с параметром пути, где установлена ваша JDK и все — JDK у вас установлена, перейдем к следующему пункту.

2. Установка Android Studio

Скачать Android Studio можно на официальном сайте. Установка Android Studio не должно иметь затруднений, вам лишь необходимо указать место для установки и совершать действия следуя подсказкам установщика. После установки Android Studio нам необходимо настроить программу для дальнейшей разработки — будет во второй части.

3. Установка Inkscape

Считаю, что данная бесплатная программа ничем не хуже платных и нашпигованных и платных Adobe Illustrator, CorelDraw… Не все при деньгах и не все без совести, чтобы пользоваться кряками 🙂 .

Заключение

В данной статье рассмотрели инструменты, которые нам пригодятся для разработки простой игры «Крестики и нолики» под Android. Следуйте в ногу обновлениям и скачивайте последние версии против привычности работы на старых 🙂 . В следующей части рассмотрим Android Studio по подробнее и займемся настройкой и запуском тестовой программы.

1.Введение в Android

Данные и последующие темы данной рубрике будут ориентированы на программистов, которые хотят освоить для себя новую мобильную платформу Android. По ходу пьесы будут затрагиваться основные моменты, на которые следует остановиться начинающему разработчику Android и это поможет избежать путаницы. Для разработки существуют фирменные наборы SDK android с IDE Eclipse на основе ADT(Android Development Tools)-плагина. Почему выбран IDE Eclipse? Потому что в Гугл решили выпустить собственную реализацию IDE, добавив к Eclipse свои инструменты с набором Android SDK и является Open Source, поэтому никому ничего ненадо платить. Недавно был релиз нового фирменного IDE на основе IntelliJ IDEA Open Source -версии. Новая Android-студия представляет собой подобно Eclipse с ADT Plugin, Android-студия предоставляет интегрированные Android средства разработки для разработки и отладки. Кроме возможностей, которые вы ожидаете от IntelliJ, Android-студия предлагает:

  • Gradle -поддержка сборки;
  • Android-специфичный рефакторинг и быстрое решение;
  • Lint-инструменты для анализа производительности, удобство использования, решения совместимости версий и другие проблемы;
  • ProGuard и приложение с возможностью подписи;
  • Мастера на основе шаблонов для создания общих конструкций и компонентов Android;
  • Визуальный редактор макета, который позволяет перетаскивать и вставлять компоненты пользовательского интерфейса, просматривать макеты на нескольких конфигурациях экрана и многое другое;
  • Встроенная поддержка для Google Cloud Platform , что позволяет легко интегрировать Google Cloud сообщения и App Engine как серверные компоненты;

В настоящее время очень много новых IDE, которых выталкивают на рынок сторонние разработчики, как правило они охватывают не узкий сегмент одного лишь Android, а комплекс различных платформ, т.е. пишешь один раз и получаешь для всех(Windows Phone, iOS, Android …). Я не думаю, что, если вы начинающий программист, то вам следует начать с них, конечно, они вам дают удобный и понятный интерфейс, который, из-за своей «сырости», редко пригоден для полноценной разработки в дальнейшем и мало того, вам еще потребуется за это платить, когда ваше понимание в Android увеличится за пределы Free -релиза. Ниже привожу список основных IDE и плагинов, которые, на данный момент участвуют на рынке мобильного ПО:

  1. Codename One — Open Source плагин для Eclipse, Net Beans, IntelliJ IDEA, есть платная версия, которая исключает ограничение в количестве раз компиляции исходного кода. На данный момент идет полным ходом его усоверщенствование и поиск багов. Имеет очень большую перспективу, так как в основе данной разработки лежит лозунг Java: «Напиши один раз, запускай везде» и действительно, данное детище позволяет писать один код и компилировать его под Android, iOS, JME, Win Phone, Mac OS, Windows, RIM. При компиляции происходит создание нативного кода под ту или иную ОС. Код компилируется на сервере разработчиков и для этого придется зарегистрироваться на сайте www.codenameone.com;
  2. Xamarin Studio — полноценная IDE для разработки приложений на C#. Позволяет писать нативный код под Android, iOS,  Win Phone. Не является бесплатной;
  3. RAD Studio XE5 — это среда разработки native-приложений для рабочих групп, которая позволяет быстро создавать приложения для Android и iOS, загружать их в магазины приложений и внедрять в организациях. Данная среда позволяет писать код на C++ и Delphi. Не является бесплатной;