Самым сложным этапом в любом деле, пожалуй, является поиск точки старта. При создании приложений для 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 (о нем я постараюсь рассказать в следующем посте).
Приложу дополнительно исходник такого болванистого проекта: Скачать
В итоге болванка будет выглядеть примерно так:
Всем спасибо за внимание и приятной разработки!
Полезные ссылки:
Android SDK
ActionBarSherlock
Sliding Menu
Создание каркаса онлайн (спасибо akira)
HoloEverywhere — Holo стиль для приложений под Android 2 и выше (спасибо Dimmerg)
Боковое меню нативным способом (спасибо zserge)
Комментарии (15)
itspers
10.06.2013 21:19+1При установке зависимостей можно выскочить ошибка, что jar файлы имеют разные SHA. В таком случае удалите файлы android-support-v4.jar из папки libs проекта sliding-menu
Меня вот всегда волновал этот вопрос. Разные SHA могут быть в том числе из-за того, что в том же ABS либа приложена устаревшая. Возможно будет правильным проклацать везде «Add Support library..» чтобы привести их все к одному виду и дать проекту самому решать какие использовать? Или все таки удалять? Работать будет в любом случае. Вопрос в том, как делать правильно?artem90 Автор
10.06.2013 21:26Насколько мне известно на личном опыте, в проектах-зависимостях может использоваться более новая версия support-library, чем у Вас в IDE. Плюс в данном случае решил оставить jar от actionbar-sherlock т.к. по сути все танцует от него. Но это мое личное мнение-наблюдение, могу ошибаться.
maratische
10.06.2013 22:17я все зависимые проекты (шерлок, слайдинг меню и прочее) всегда копирую в папку проекта, так как код потом уйдет в репозиторий и должен оттуда после чекина разворачиваться у любого разработчика, то я наоборот, из свежесозданого проекта раскидываю либу по шерлокам и прочему.
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), либо ничего.
Статья написана вроде бы для новичков (учитывая какие очевидные вещи она рассматривает), но при этом никакие важные новичкам детали вы не рассмотрели.artem90 Автор
10.06.2013 22:20Вы что, серьезно? То есть я согласен с вами, что зря плодить картинки не нужно, но уж иконка-то приложения должна быть в разных разрешениях? А вы еще и иконку среднего разрешения берете, какая разница что на планшете она будет жутко размытой, правда?
Возможно, Вы прочитали «по диагонали». Я писал, что лично я оставляю задачу нарезки изображений, адаптацию к различным экранам и т.п. напоследок.
И в целом — зачем нужно приложение с actionbar в стиле Holo, если у вас сами контролы activity будут выглядеть в стиле 2.х? По-моему либо все в стиле Holo (читайте про HoloEverywhere), либо ничего.
За HoloEverywhere спасибо, возьму себе на вооружение.
zserge
10.06.2013 21:54+2А зачем SlidingMenu, если родной Navigation Drawer уже доступен в последних версиях support library? developer.android.com/training/implementing-navigation/nav-drawer.html
maratische
11.06.2013 10:53там прямо в примере указано
<uses-sdk android:minSdkVersion="14" android:targetSdkVersion="17" />
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).
senneco
12.06.2013 10:12А мне SlidingMenu понадобился всего лишь для того, чтобы при открытии правого меню, контент сдвигался вправо =( Может быть вы знаете способ, чтобы сделать такую функциональность при использовании родного Navigation Drawer?
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(); } } };
b01d
Статья из тех — про как нарисовать сову:
Рисуем овал
рисуем сову
PROFIT!!!