Простой каркас Android приложения


Самым сложным этапом в любом деле, пожалуй, является поиск точки старта. При создании приложений для 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)
Share post

Comments 15

    +8
    Статья из тех — про как нарисовать сову:
    Рисуем овал
    рисуем сову
    PROFIT!!!
      +1
      При установке зависимостей можно выскочить ошибка, что jar файлы имеют разные SHA. В таком случае удалите файлы android-support-v4.jar из папки libs проекта sliding-menu

      Меня вот всегда волновал этот вопрос. Разные SHA могут быть в том числе из-за того, что в том же ABS либа приложена устаревшая. Возможно будет правильным проклацать везде «Add Support library..» чтобы привести их все к одному виду и дать проекту самому решать какие использовать? Или все таки удалять? Работать будет в любом случае. Вопрос в том, как делать правильно?
        0
        Насколько мне известно на личном опыте, в проектах-зависимостях может использоваться более новая версия support-library, чем у Вас в IDE. Плюс в данном случае решил оставить jar от actionbar-sherlock т.к. по сути все танцует от него. Но это мое личное мнение-наблюдение, могу ошибаться.
          0
          я все зависимые проекты (шерлок, слайдинг меню и прочее) всегда копирую в папку проекта, так как код потом уйдет в репозиторий и должен оттуда после чекина разворачиваться у любого разработчика, то я наоборот, из свежесозданого проекта раскидываю либу по шерлокам и прочему.
        +7
        Я просто оставлю эту ссылку тут.
        androidkickstartr.com/
          +1
          Полезно, спасибо!
          +1
          Из папки drawable-mdpi перенесем файл иконки приложения (по-умолчанию eclipse обзывает его ic_launcher.png) в папку drawable
          Удалим папки drawable-XXX и папки values-XXX (мое мнение, что данные папки должны создаваться по мере необходимости и/или предрелизной подготовки приложения)

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

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

          И в целом — зачем нужно приложение с actionbar в стиле Holo, если у вас сами контролы activity будут выглядеть в стиле 2.х? По-моему либо все в стиле Holo (читайте про HoloEverywhere), либо ничего.
          Статья написана вроде бы для новичков (учитывая какие очевидные вещи она рассматривает), но при этом никакие важные новичкам детали вы не рассмотрели.
            0
            Вы что, серьезно? То есть я согласен с вами, что зря плодить картинки не нужно, но уж иконка-то приложения должна быть в разных разрешениях? А вы еще и иконку среднего разрешения берете, какая разница что на планшете она будет жутко размытой, правда?
            Возможно, Вы прочитали «по диагонали». Я писал, что лично я оставляю задачу нарезки изображений, адаптацию к различным экранам и т.п. напоследок.
            И в целом — зачем нужно приложение с actionbar в стиле Holo, если у вас сами контролы activity будут выглядеть в стиле 2.х? По-моему либо все в стиле Holo (читайте про HoloEverywhere), либо ничего.
            За HoloEverywhere спасибо, возьму себе на вооружение.
            0
            Какая-то статья из прошлого — дежавю, как будто я уже всё это слышал и не раз
              +2
              А зачем SlidingMenu, если родной Navigation Drawer уже доступен в последних версиях support library? developer.android.com/training/implementing-navigation/nav-drawer.html
                0
                Спасибо, добавил в ссылки.
                  0
                  там прямо в примере указано
                  <uses-sdk android:minSdkVersion="14" android:targetSdkVersion="17" />
                  
                    0
                    Если вы о том, что нативный Drawer не заработает на apilevel<14, то DrawerLayout включен в support-v4, т.е. будет работать начиная с андроида 1.6.

                    Просто в примере гугла используют почему-то родной FragmentManager, вместо support.v4.FragmentManager. Потому и повысили minSdkVersion до 14. У меня проекты с DrawerLayout успешно собирались с minSdkVersion=7 (Android 2.1).
                    0
                    А мне SlidingMenu понадобился всего лишь для того, чтобы при открытии правого меню, контент сдвигался вправо =( Может быть вы знаете способ, чтобы сделать такую функциональность при использовании родного Navigation Drawer?
                      0
                      Придумал для себя костыль — нужно просто сделать так, чтобы при открытии 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();
                                      }
                                  }
                              };
                      


                  Only users with full accounts can post comments. Log in, please.