Самым сложным этапом в любом деле, пожалуй, является поиск точки старта. При создании приложений для android эту задачу приходится делить на несколько и определять, например, для каких версий android должно быть будущее приложение.
Не буду разводить демагогию и перейду к самой сути. Для создания, с Вашего позволения, стандартно-шаблонного приложения (левое слайдинг-меню, actionbar), которое будет одинаково смотреться как на android-2.2 так и на android-4 я предлагаю не изобретать велосипеды и использовать готовые решения actionbar-sherlock и sliding-menu.
В этой статье я нарочно опущу процесс установки среды разработки, но буду подразумевать, что разработка ведется в eclipse android sdk.

Подготовка

  • Скачиваем и импортируем в рабочее пространство проекты actionbar-sherlock и sliding-menu.
  • Для проекта sliding-menu устанавливаем зависимость от проекта actionbar-sherlock.
    При установке зависимостей можно выскочить ошибка, что jar файлы имеют разные SHA. В таком случае удалите файлы android-support-v4.jar из папки libs проекта sliding-menu
  • Создаем новый проект для своего приложения, как обычно. При установке выбираем Minimum-Required-SDK как API8 (android-2.2) и Target SDK какой требуется (API14 и выше). Устанавливаем нашему проекту зависимости от проектов actionbar-sherlock и sliding-menu.
    Возможно, что будет опять конфликт jar файлов, как в пункте выше. Тогда просто удалите из проекта своего приложения файл android-support-v4.jar в папке libs.


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

  • В папке res создадим папку drawable
  • Из папки drawable-mdpi перенесем файл иконки приложения (по-умолчанию eclipse обзывает его ic_launcher.png) в папку drawable
  • Удалим папки drawable-XXX и папки values-XXX (мое мнение, что данные папки должны создаваться по мере необходимости и/или предрелизной подготовки приложения)
  • В файл res/values/styles.xml укажем, что стиль AppBaseTheme будет наследоваться от стиля style/Theme.Sherlock.Light


Сама соль

У нас все готово для создания приложения – у нас одинаковый внешний вид приложения в стиле 4-го android и это все одинаково прекрасно смотрится и на android-2.2.
На данный момент у нас не хватает только бокового меню. Для его реализации создадим файл разметки в res/layout и назовем его, к примеру, sidemenu.xml. Пока трогать его не будем.
Перейдем к главной activity (если не создано, создайте). Наша activity будет наследоваться не от стандартного класса activity, а от класса SherlockFragmentActivity.
В методе onCreate опишем реализацию нашего бокового меню:
        SlidingMenu menu = new SlidingMenu(this);
        menu.setMode(SlidingMenu.LEFT);
        menu.setTouchModeAbove(SlidingMenu.TOUCHMODE_FULLSCREEN);
        menu.setFadeDegree(0.35f);
        menu.attachToActivity(this, SlidingMenu.SLIDING_CONTENT);
        menu.setMenu(R.layout.sidemenu);
        menu.setBehindWidth(200);
        menu.setBackgroundColor(0xFF333333);
        getSupportActionBar().setHomeButtonEnabled(true);

После этих действий у нас готова болванка для создания приложения, которое имеет боковое меню (не забудьте внести свою разметку в файл res/layout/sidemenu.xml), которое открывается/закрывается по «потягиванию» вправо/влево, а так же наше приложение имеет одинаковый внешний вид для всех версий android. В качестве приятного бонуса мы получили еще и полностью кастомизируемый actionbar (о нем я постараюсь рассказать в следующем посте).

Приложу дополнительно исходник такого болванистого проекта: Скачать
В итоге болванка будет выглядеть примерно так:
image
Всем спасибо за внимание и приятной разработки!

Полезные ссылки:
Android SDK
ActionBarSherlock
Sliding Menu
Создание каркаса онлайн (спасибо akira)
HoloEverywhere — Holo стиль для приложений под Android 2 и выше (спасибо Dimmerg)
Боковое меню нативным способом (спасибо zserge)

Комментарии (15)


  1. b01d
    10.06.2013 21:17
    +8

    Статья из тех — про как нарисовать сову:
    Рисуем овал
    рисуем сову
    PROFIT!!!


  1. itspers
    10.06.2013 21:19
    +1

    При установке зависимостей можно выскочить ошибка, что jar файлы имеют разные SHA. В таком случае удалите файлы android-support-v4.jar из папки libs проекта sliding-menu

    Меня вот всегда волновал этот вопрос. Разные SHA могут быть в том числе из-за того, что в том же ABS либа приложена устаревшая. Возможно будет правильным проклацать везде «Add Support library..» чтобы привести их все к одному виду и дать проекту самому решать какие использовать? Или все таки удалять? Работать будет в любом случае. Вопрос в том, как делать правильно?


    1. artem90 Автор
      10.06.2013 21:26

      Насколько мне известно на личном опыте, в проектах-зависимостях может использоваться более новая версия support-library, чем у Вас в IDE. Плюс в данном случае решил оставить jar от actionbar-sherlock т.к. по сути все танцует от него. Но это мое личное мнение-наблюдение, могу ошибаться.


      1. maratische
        10.06.2013 22:17

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


  1. akira
    10.06.2013 21:44
    +7

    Я просто оставлю эту ссылку тут.
    androidkickstartr.com/


    1. artem90 Автор
      10.06.2013 22:04
      +1

      Полезно, спасибо!


  1. Dimmerg
    10.06.2013 21:47
    +1

    Из папки drawable-mdpi перенесем файл иконки приложения (по-умолчанию eclipse обзывает его ic_launcher.png) в папку drawable
    Удалим папки drawable-XXX и папки values-XXX (мое мнение, что данные папки должны создаваться по мере необходимости и/или предрелизной подготовки приложения)

    Вы что, серьезно? То есть я согласен с вами, что зря плодить картинки не нужно, но уж иконка-то приложения должна быть в разных разрешениях? А вы еще и иконку среднего разрешения берете, какая разница что на планшете она будет жутко размытой, правда?

    Сама соль
    В самой соли вы настраиваете sliding menu, но:
    1) вы не объясняете абсолютно, что за функции вы вызываете и зачем
    2) магические цифры, которые вы передаете в качестве параметров, едва ли не самое важное в этой соли, но их вы тоже объяснять не стали

    И в целом — зачем нужно приложение с actionbar в стиле Holo, если у вас сами контролы activity будут выглядеть в стиле 2.х? По-моему либо все в стиле Holo (читайте про HoloEverywhere), либо ничего.
    Статья написана вроде бы для новичков (учитывая какие очевидные вещи она рассматривает), но при этом никакие важные новичкам детали вы не рассмотрели.


    1. artem90 Автор
      10.06.2013 22:20

      Вы что, серьезно? То есть я согласен с вами, что зря плодить картинки не нужно, но уж иконка-то приложения должна быть в разных разрешениях? А вы еще и иконку среднего разрешения берете, какая разница что на планшете она будет жутко размытой, правда?
      Возможно, Вы прочитали «по диагонали». Я писал, что лично я оставляю задачу нарезки изображений, адаптацию к различным экранам и т.п. напоследок.
      И в целом — зачем нужно приложение с actionbar в стиле Holo, если у вас сами контролы activity будут выглядеть в стиле 2.х? По-моему либо все в стиле Holo (читайте про HoloEverywhere), либо ничего.
      За HoloEverywhere спасибо, возьму себе на вооружение.


  1. sagus
    10.06.2013 21:50

    Какая-то статья из прошлого — дежавю, как будто я уже всё это слышал и не раз


  1. zserge
    10.06.2013 21:54
    +2

    А зачем SlidingMenu, если родной Navigation Drawer уже доступен в последних версиях support library? developer.android.com/training/implementing-navigation/nav-drawer.html


    1. artem90 Автор
      11.06.2013 10:44

      Спасибо, добавил в ссылки.


    1. maratische
      11.06.2013 10:53

      там прямо в примере указано

      <uses-sdk android:minSdkVersion="14" android:targetSdkVersion="17" />
      


      1. zserge
        11.06.2013 17:17

        Если вы о том, что нативный Drawer не заработает на apilevel<14, то DrawerLayout включен в support-v4, т.е. будет работать начиная с андроида 1.6.

        Просто в примере гугла используют почему-то родной FragmentManager, вместо support.v4.FragmentManager. Потому и повысили minSdkVersion до 14. У меня проекты с DrawerLayout успешно собирались с minSdkVersion=7 (Android 2.1).


    1. senneco
      12.06.2013 10:12

      А мне SlidingMenu понадобился всего лишь для того, чтобы при открытии правого меню, контент сдвигался вправо =( Может быть вы знаете способ, чтобы сделать такую функциональность при использовании родного Navigation Drawer?


      1. senneco
        13.06.2013 19:33

        Придумал для себя костыль — нужно просто сделать так, чтобы при открытии DrawerLayout'а двигался DrawerContent. Единственное, если применить это решение к оф. примеру, то при выборе пункта из навигации, смена контента проходит с подтормаживанием. Причём проблема эта наблюдалась как на SGS 2, так и на SG Ace. Но я убрал подгрузку картинок, и всё стало летать, поэтому думаю, что тормозит не из-за моего решения, а из-за картинок.

        Как примерно это сделать
        mDrawerToggle = new SherlockActionBarDrawerToggle(
                        this,                  /* host Activity */
                        mDrawerLayout,         /* DrawerLayout object */
                        R.drawable.ic_drawer,  /* nav drawer image to replace 'Up' caret */
                        R.string.drawer_open,  /* "open drawer" description for accessibility */
                        R.string.drawer_close  /* "close drawer" description for accessibility */
                        ) {
                    @Override
                    public void onDrawerSlide(View drawerView, float slideOffset) {
                        super.onDrawerSlide(drawerView, slideOffset);
                        float scrollTo = drawerView.getWidth() * slideOffset;
        
                        if (Build.VERSION.SDK_INT >= 11)
                        {
                            // Начиная с API 11 нам доступен метод setX,
                            // который сместит контент вправо на ту позицию, на какую нам надо
                            mDrawerContent.setX(scrollTo);
                        }
                        else
                        {
                            // А вот в более ранних версиях андроида придётся повозиться.
                            // Нужно сперва подключить библиотеку NineOldAndroids
                            // И уже анимацией сдвинуть контент на нужную позицию.
                            ObjectAnimator.ofFloat(mDrawerContent, "translationX", scrollTo).setDuration(0).start();
                        }
                    }
                };