Что-то пауза с постами у нас получается совсем нечеловеческая. Попробуем еще разок возобновить публикации.
И сегодня мы познакомимся с библиотекой, реализующей UI-паттерн Action Bar для Android-приложений.

Разработчики библиотеки позиционируют ее как расширение к Compatibility Library, которое для создания ActionBar использует нативную реализацию, если это поддерживается системой, или же вручную дублирует нужный функционал.

Библиотека является open-source проектом и доступна для загрузки на GitHub.

Начало

Начать пользоваться библиотекой довольно просто. Нужно сделать вот что:

  • Унаследовать активити от SherlockActivity (или SherlockListActivity)
  • Переопределить метод onCreateOptionsMenu() и в нем заполнить объект Menu информацией о кнопках
  • В onCreate() или в манифесте указать что используется тема Theme_Sherlock

В итоге код получится приблизительно таким:

package ru.mobiledeveloper.actionbarsherlocktest;

import com.actionbarsherlock.app.SherlockActivity;
import com.actionbarsherlock.view.Menu;
import com.actionbarsherlock.view.MenuItem;

import android.os.Bundle;
import ru.mobiledeveloper.actionbarsherlocktest.R;

public class ActionBarSherlockTestActivity extends SherlockActivity {

    @Override
    public void onCreate(Bundle savedInstanceState) {
    	setTheme(R.style.Theme_Sherlock);
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);
    }
    
    @Override
    public boolean onCreateOptionsMenu(Menu menu) {
        menu.add("Save")
            .setIcon(R.drawable.ic_compose)
            .setShowAsAction(MenuItem.SHOW_AS_ACTION_IF_ROOM);

        menu.add("Search")
            .setShowAsAction(MenuItem.SHOW_AS_ACTION_IF_ROOM | 
                MenuItem.SHOW_AS_ACTION_WITH_TEXT);

        return true;
    }
}

В результате получим такой внешний вид окна приложения:

Режим действия

ActionBar Sherlock поддерживает возможность отображения контекстно-зависимого содержания. Такая возможность называется режим действий (ActionMode). режим действий можно использовать, например, для отображения контекстного “меню” при длинном нажатии на єлемент списка.
Для того, чтобі добавить возможность отображать режим действий в приложение, нужно сделать следующее:

  • Создать класс, производный от ActionMode.Callback
  • Реализовать в этом классе метод onCreateActionMode(), в котором добавить нужные команды.
  • Реализовать в этом классе метод onActionItemClicked(), в котором написать код, обрабатывающий нажатия на кнопки в ActionBar
  • Для перехода в режим действий вызвать метод startActionMode() и в качестве параметра передать ему объект выше указанного класса

В коде это выглядит приблизительно так:

public class ActionBarSherlockTestActivity extends SherlockActivity {
	
	ActionMode mMode;
	
	private final class ActionModeA implements ActionMode.Callback {

        public boolean onCreateActionMode(ActionMode mode, Menu menu) {
            menu.add("Save")
                .setIcon(R.drawable.ic_compose)
                .setShowAsAction(MenuItem.SHOW_AS_ACTION_IF_ROOM);
            menu.add("Search")
                .setIcon(R.drawable.ic_search)
                .setShowAsAction(MenuItem.SHOW_AS_ACTION_IF_ROOM);
            return true;
        }

		public boolean onPrepareActionMode(ActionMode mode, Menu menu) {
			// TODO Auto-generated method stub
			return false;
		}

		public boolean onActionItemClicked(ActionMode mode, MenuItem item) {
			Toast.makeText(ActionBarSherlockTestActivity.this, 
                            "Got click: " + item, Toast.LENGTH_SHORT).show();
            mode.finish();
			return true;
		}

		public void onDestroyActionMode(ActionMode mode) {
			// TODO Auto-generated method stub
			
		}
        
    }

    @Override
    public void onCreate(Bundle savedInstanceState) {
    	setTheme(R.style.Theme_Sherlock);
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);
        
        Button btnTest = (Button)findViewById(R.id.btnTest);
        if(btnTest != null) {
        	btnTest.setOnClickListener(new OnClickListener() {
				
				public void onClick(View v) {
					mMode = startActionMode(new ActionModeA());
				}
			});
        }
    }
    
    @Override
    public boolean onCreateOptionsMenu(Menu menu) {
        menu.add("Save")
            .setIcon(R.drawable.ic_compose)
            .setShowAsAction(MenuItem.SHOW_AS_ACTION_IF_ROOM);

        menu.add("Search")
            .setShowAsAction(MenuItem.SHOW_AS_ACTION_IF_ROOM | 
                MenuItem.SHOW_AS_ACTION_WITH_TEXT);
        return true;
    }
}

И в результате получаем такое:

Существует, также, возможность отображать ActionBar только в режиме Action Mode и скрывать ее в остальное время работы приложения. Для этого в onCreate() надо вызвать requestWindowFeature(Window.FEATURE_NO_TITLE).

Провайдеры действий

ActionBar Sherlock поддерживает работу с провайдерами действий (Action Provider), которые позволяют реализовать отображение собственных виджетов в ActionBar и добавить более гибкое взаимодействие с пользователем. Action Provier можно повторно использовать в нескольких активитях.
Есть две возможности указать Action Provider для элемента – прописать его в XML файле для пункта меню или указать в коде с помощью setActionProvider().
Рассмотрим реализацию Action Provider’а, который по нажатию на кнопку в ActionBar открывает системные настройки:

public static class SettingsActionProvider extends ActionProvider {
	private static final Intent sSettingsIntent = new Intent(Settings.ACTION_SETTINGS);

	private final Context mContext;

    public SettingsActionProvider(Context context) {
        super(context);
        mContext = context;
    }

    @Override
    public View onCreateActionView() {
        LayoutInflater layoutInflater = LayoutInflater.from(mContext);
        View view = layoutInflater.inflate(R.layout.settings_action_provider, null);
        ImageButton button = (ImageButton) view.findViewById(R.id.button);
        button.setOnClickListener(new View.OnClickListener() {
            public void onClick(View v) {
                mContext.startActivity(sSettingsIntent);
            }
        });
        return view;
    }

    @Override
    public boolean onPerformDefaultAction() {
        mContext.startActivity(sSettingsIntent);
        return true;
    }
}
...
@Override
public boolean onCreateOptionsMenu(Menu menu) {
    // Этот элемент будет отображен в ActionBar
    menu.add("Settings")
        .setActionProvider(new SettingsActionProvider(
        		ActionBarSherlockTestActivity.this))
        .setShowAsAction(MenuItem.SHOW_AS_ACTION_IF_ROOM | 
        		MenuItem.SHOW_AS_ACTION_WITH_TEXT);
        
    // Этот элемент будет отображен в стандартном меню
    menu.add("Settings")
        .setActionProvider(new SettingsActionProvider(
        		ActionBarSherlockTestActivity.this))
        .setShowAsAction(MenuItem.SHOW_AS_ACTION_NEVER);
    return true;
}

XML-файл для кнопки:

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="wrap_content"
    android:layout_height="match_parent"
    android:layout_gravity="center"
    android:focusable="true"
    android:addStatesFromChildren="true"
    android:background="?attr/actionBarItemBackground"
    style="?attr/actionButtonStyle">
    <ImageButton android:id="@+id/button"
        android:background="@drawable/ic_launcher_settings"
        android:layout_width="32dip"
        android:layout_height="32dip"
        android:layout_gravity="center"
        android:scaleType="fitCenter"
        android:adjustViewBounds="true" />
</LinearLayout>

После создания провайдера действий и добавления его к пунктам меню получим такое:

Collapsible Actions

Есть возможность, при нажатии на пункт меню, отображать собственный контрол на всю ширину ActionBar. Например, для поиска можно отображать текстовое поле. Сделать это можно, указав дайаут с помощью setActionView() и стиль MenuItem.SHOW_AS_ACTION_COLLAPSE_ACTION_VIEW.

public boolean onCreateOptionsMenu(Menu menu) {
    boolean isLight = SampleList.THEME == R.style.Theme_Sherlock_Light;
    menu.add("Search")
        .setIcon(isLight ? R.drawable.ic_search_inverse : R.drawable.ic_search)
        .setActionView(R.layout.collapsible_edittext)
        .setShowAsAction(MenuItem.SHOW_AS_ACTION_ALWAYS | 
                MenuItem.SHOW_AS_ACTION_COLLAPSE_ACTION_VIEW);
    return true;
}

При нажатии на пункт в ActionBar будет отображен контрол из XML файла collapsible_edittext.xml.

Полезные функции

Индикатор прогресса
Есть возможность отобразить индикатор прогресса в ActionBar. Такая возможность может быть полезна для отображения прогресса длительной операции. Сделать это можно с помощью метода setSupportProgressBarIndeterminateVisibility().
Оверлей
Можно отображать ActionBar поверх контента при скроллинге. Очень полезная возможность, например, при просмотре текстов. Перевести ActinBar в режим оверлея можно с помощью метода requestWindowFeature(Window.FEATURE_ACTION_BAR_OVERLAY).

Различные типы активитей

В ActionBar Sherlock помимо обычной активити есть классы для отображения активитей со списками, активитей настройки, диалогов.
SherlockPreferenceActivity
Этот класс используется для отображения окон настройки. Функционал аналогичен PreferenceActivity из Android SDK.

SherlockListActivity и SherlockExpandableListActivity
Это активити, производные от ListActivity и ExpandableListActivity соответственно, в которую добавлен функционал по работе с ActionBar.
Диалоги
Есть возможность отображать активити в виде диалогов. Для этого надо указать соответствующую тему в манифесте (необходимо указывать тему именно в манифесте).

<activity
    android:name=".Dialog"
    android:label="@string/dialog"
    android:theme="@style/Theme.Sherlock.Dialog">
    <intent-filter>
        <action android:name="android.intent.action.MAIN" />
        <category android:name="com.actionbarsherlock.sample.demos.EXAMPLE" />
    </intent-filter>
</activity>

На вид выглядит так:

Пара слов о навигации

В ActionBar Sherlock есть возможность организовать навигацию внутри приложения средствами ActionBar. Визуально получается очень приятный результат, например можно реализовать навигацию посредством выпадающего списка или вкладками или еще каким-либо способом, встроив контрол для навигации в ActionBar.

Более подробно реализацию навигации рассмотрим в следующей части статьи.

Previous ArticleNext Article
Технический директор IT-Dimension, компании-разработчика кросс-платформенного программного обеспечения

Leave a Reply

Your email address will not be published. Required fields are marked *

S.

Smaato. Зарабатываем деньги на своем приложении

Сегодня у нас еще одна статья о том, как можно заработать на своем мобильном приложении. За статью спасибо Ромео Ордосу.

Кто еще не в курсе smaato это компания, специализирующаяся на мобильной рекламе, объединяющая в одну сеть различных поставщиков рекламы, таких как Admod и Quattrowireless. Прицип работы прост: вы создаете свое приложение, внедряете в него рекламу, и зарабатываете на этом деньги. Для разработчиков СНГ это довольно хорошая альтернатива, так как размещать платные приложения на Android Market пока еще нельзя.

В январе 2010 года smaato выпустили SDK для работы с ОС Android. Мне хотелось бы поделиться небольшим опытом работы с smaato. Возможно, кому-то это будет полезно.
Регистрируемся на сайте smaato и добавляем свое приложение. Жмем по ссылке “Install Tools” справа от приложения и качаем SOMA SDK for Android. Записываем свои PublisherID (Идентификатор разработчика) и AdspaceID (Идентификатор приложения).

SDK внедряется в приложение очень легко. Всё подробно описано в SDK, поэтому сам процесс описывать не стану. Хочу сразу предупредить о проблеме с которой столкнулся сам: если не активировать приложение на сайте(кнопка status), то реклама появляться не будет, и в логах DDMS появится ошибка об отсутствии параметра devip(IP адрес запрашивающего устройства). Чтобы избежать этого, нужно активировать режим отладки (Описано в документации).

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

Отчет за Январь 2010 для моего приложения Music Junk:

Количество скачиваний: 49324
Количество активных установок: 33277

Вывод денег происходит в страны СНГ происходит через SWIFT – переводы. Для этого необходимо открыть в банке счет именно для этих переводов. Оплата производится по истечении 60 дней по окончанию календарного месяца.

Я воспользовался услугами ПриватБанка, так как давно являюсь их клиентом и у них удобная система интернет-банкинга. Карта открывается в USD и моментально, цена: 30 грн(~120 руб). С её помощью можно в любом банкомате проверить баланс, но обналичивать деньги можно только в отделениях банка. Также, воспользовавшись услугой Приват24 можно легко прослеживать поступления на счет через интернет и даже по SMS. Вместе с картой нужно попросить сделать распечатку реквизитов банка для SWIFT – переводов. (прим. Есть возможность открыть VISA для этих же переводов. Но это долго и дороже, поэтому у меня на этот счет информации нет). Как мне объяснили, денежные переводы не облагаются никаким налогом, но взимается комиссия в размере 1% от суммы перевода.

Также стоит помнить, что Smaato забирает процент от прибыли(Revenue) себе по такой таблице:
1 – 5.000.000 показов: 30% от общей прибыли
5.000.001 – 20.000.000 показов: 25% от общей прибыли
> 20.000.000: 20% от общей прибыли

На дворе март… Я захожу на свой аккаунт smaato и вижу следующее:

Ура! Перехожу по ссылке и попадаю на экран ввода информации о счете:

Немного об этих полях:

Bank Account Information:
Payment Preference – выбираем International Wire Transfer. Единственный приемлемый метод для нас;
Bank Name – Имя банка(напр. PRIVATBANK);
Bank Account – номер счета. Он находится в договоре, а не на поверхности выданной карты(!!!);
Country – Страна, где находится банк(напр. Ukraine);
City – Город главного отделения банка(напр. DNEPROPETROVSK);
Prov/Region – Регион, где находится главное отделение банка(напр. DNEPROPETROVSKAYA OBL.);
SWIFT Code – SWIFT код банка(напр. PBANUA2X);

Beneficiary Address:
Address 1 – Адрес проживания(Улица, дом, квартира);
Country – страна проживания;
City – город проживания;
Prov/Region – область или АР;
ZIP/Postal Code – местный индекс;

Tax Identification:
Выбираем “Other Tax ID” и вписываем свой ИНН.

По истечении месяца вы получаете выписку по счету:

Credit Note Total – это те деньги, которые вам и должны будут перевести.

15 апреля я получил уведомление о переводе. Как мне объяснил представитель Smaato перевод может занимать и меньшее время, но в марте у них были технические проблемы и поэтому этот процесс занял большее время. За Январь 2010 я получил 750$. Формула по которой рассчитана прибыль: Net Revenue – 30% – 20$.

В итоге, я считаю Smaato неплохим источником прибыли для разработчиков бесплатного мобильного софта, и особенно для тех, у кого нет возможности размещать платные приложения.

Профит и левелап получены.

Оригинал статьи и интересное обсуждение.

В.

Вышла Beta-версия средств разработки для Windows Phone 7

Microsoft выпустили Windows Phone Developer Tools Beta – новую версию средств разработки приложений для Windows Phone 7.

Список изменений

  • Несколько сборок объединены в одну – Microsoft.Phone:
    • Microsoft.Phone.Controls
    • Microsoft.Phone.Controls.Navigation
    • Microsoft.Phone.Controls.WebBrowser
    • Microsoft.Phone.Controls.WebBrowserInterop
    • Microsoft.Phone.Shell
    • Microsoft.Phone.Notification
    • Microsoft.Phone.Execution
    • Microsoft.Phone.Info
    • Microsoft.Phone.Tasks
    • Microsoft.Devices
  • System.Device.Location теперь является частью сборки System.Device
  • Сборка Microsoft.Devices переименована; классы этой сборки перенесены в сборку Microsoft.Phone. Часть классов сменила пространство имен.
  • Application.Resources удалены из App.xaml и шаблоны изменены.
  • ToggleControlSwitch и toggleControlButton удалены.
  • ListView и ListViewItem удалены.
  • ToggleControlSwitch и ToggleControlButton удалены.
  • Expression Blend for Windows Phone теперь входит в дистрибутив средств разработки;
  • С помощью Developer Registration Utility можно разблокировать устройство на базе WP7 для целей разработки;
  • XAP Deployment Tool позволит размещать XAP-файлы напрямую на разблокированное устройство;
  • Элементов управления Panorama и Pivot до сих пор нет, их появление ожидается в течении пары недель;

Посмотреть более полный список изменений.

Скачать средства разработки для Windows Phone 7