Мы разработали абсолютно новый виджет статистики для Behance.
Он отображает информацию о просмотрах твоих проектов, профиля и лайках, так же ты можешь получать статистику за последние 24 часа.
Существует два типа виджета — обычный и расширенный.
В процессе разработки мы постарались сделать виджет простым, быстрым и понятным для пользователя. Так же мы сделали его действительно стабильным и дружелюбным к батарейке твоего смартфона.
Ты можешь создавать сколько угодно экземпляров виджета, например чтобы смотреть не только свою статистику, но и статистику твоих друзей.
Рано или поздно при разработке приложения под iPhone возникает необходимость адаптировать интерфейс приложения под iPad. Если приложение большое создавать интерфейс под планшет с нуля может оказаться весьма накладным по времени и ресурсам делом.
Чтобы облегчить себе труд можно создать файл с интерфейсом для iPad из файла интерфейса iPhone. Для этого необходимо выполнить следующие шаги:
Дублируем файл MainStoryboard_iPhone.storyboard и переименовываем дубль в MainStoryboard_iPad.storyboard
Открываем наш файл обычным текстовым редактором (рекомендую для этого использовать SublimeText2) и ищем следующий атрибут: targetRuntime=«iOS.CocoaTouch», дописываем в конце значения этого атрибута “.iPad”, должно получиться вот так: targetRuntime=«iOS.CocoaTouch.iPad»
Далее если присутствует тег “simulatedScreenMetrics” удаляем в нем атрибут “type” со значением “retina4”
Далее пробегаемся автозаменой по файлу и заменяем значения ширин и высот экрана iPhone на значения экрана iPad (например width=«320» => width=«768», height=«568» => height=«1024»)
Сохраняем Storyboard, открываем ее в Interface Builder, корректируем положения экранов и лэйауты элементов
Таким не хитрым образом мы быстро получили вариант интерфейса для iPad из интерфейса iPhone.
Для отладки своих приложений на живых девайсах разработчики в большинстве своем подключают устройство по USB. Стоит подключить устройство (с разрешенным режимом отладки по USB), его тут же видит утилита ADB и позволяет отлаживать. Но у такого подхода есть два очевидных минуса:
Устройство постоянно заряжается, что пагубно влияет на аккумулятор
От повышенного износа страдает USB-разъем на устройстве и в один прекрасный момент может сломаться
Не все знают, но утилита ADB имеет режим отладки по сети, что позволит нам организовать сей процесс через Wi-Fi и избавиться от проблем, описанных выше.
Итак все, что нам понадобится это консоль и немного времени. Стоит сразу сказать, что для включения данной фичи устройство все же придется присоединить к компьютеру по USB в первый раз. Можно обойтись и без этого, но тогда необходим root-доступ на девайсе.
Перво наперво необходимо подсоединить девайс к компьютеру и убедиться, что отладки работает (например при помощи Android Studio или Xamarin Studio).
Далее необходимо не отключая устройство запустить терминал, перейти в директорию, где находится утилита ADB, для моего пользователя команда выглядит так: cd /Users/gratytony/Library/Android/sdk/platform-tools
Далее необходимо перезапустить ADB в режиме прослушивания TCP-порта: adb -d tcpip 5555
В ответ должно прийти: restarting in TCP mode port: 5555
Если в таком состоянии терминал завис — смело нажимаем Ctrl+C, по неизвестной причине иногда такое происходит. Можно не переживать — ADB перезапустился корректно.
Далее необходимо узнать IP-адрес девайса, это можно сделать через adb-shell, но есть и более простой способ — зайти в настройки устройства и просмотреть статус Wi-Fi сети, к которой оно подключено — там будет виден IP-адрес устройства.
Последнее, что нужно сделать это подключиться к устройству при помощи команды: adb connect IP_АДРЕС_УСТРОЙСТВА:5555
В ответ должно прийти: connected to IP_АДРЕС_УСТРОЙСТВА:5555
Все, теперь можно смело отключать устройство от USB и отлаживаться по воздуху.
Для прекращения отладки по USB нужно ввести команду: adb -s IP_АДРЕС_УСТРОЙСТВА:5555 usb
В ответ должно прийти: restarting in USB mode
Отладка работает хорошо, единственное условие, которое необходимо выполнить — это быстрый Wi-Fi. При маленькой скорости соединения загрузка приложения на устройство и шагание по точкам останова существенно медленнее, чем по кабелю.
UPDATE:
Если узнать IP-адрес через интерфейс Android не получается можно проделать следующие действия (при подключенном по USB устройстве). Ввести команду: adb shell
В ответ откроется консоль на устройстве: shell@mako:/ $
Далее необходимо ввести команду: netcfg
В ответ появится список интерфейсов на устройстве, нас будет интересовать Wi-Fi, у меня это wlan0, рядом будет написан соответствующий интерфейс IP-адрес.
Чтобы выйти из консоли на устройстве используем команду exit.
Сегодня пост немного не по тематике блога, но считаю информацию очень важной. Я в качестве хобби немного занимаюсь системным администрированием, на текущем объекте необходимо настроить Wi-Fi, при этом важно чтобы «брало везде» (трехэтажный дом и летняя кухня — отдельная постройка), к тому же, чтобы еще был бесшовный роуминг клиента между точками доступа.
После общения с поставщиками выбор пал на Ubiquiti UniFi. Железки классные и красивые, но имеют один нюанс — для настройки и работы им нужен софтверный контроллер (программа на Java, которая фактически поднимает web-сервер для web-морды, базу данных и «рулит» точками). Т. е. реально настроить точку можно только через него. Подход интересный, больше нацелен на сети предприятия, когда рулить нужно не 2 точками, а 50-100 и более. Поставщик клялся, что точки умеют работать самостоятельно и контроллер нужен только для первоначальной настройки.
В итоге уже на объекте Wi-Fi честно работал, но только в том случае, если был активен компьютер с софтверным контроллером. Если от сети отключиться — точки мгновенно переходили в Isolated-режим, дропали всех клиентов и переставали транслировать SSID сети. В общем кошмар :)
После длительного гугления был найден (и позже испытан) воркэраунд!
Внимание!!!!
Чтобы все взлетело, нужно при конфигурировании точки обязательно указать валидный Gateway, при этом IP-адрес шлюза ДОЛЖЕН быть всегда онлайн. Пока шлюз онлайн — точка радуется и работает, если шлюз пропадает — точка через некоторое время тухнет. При этом адрес шлюза у меня был равен адресу, с которого происходила настройка UniFi (но это не существенно и можно подсунуть любой IP, лишь бы он был все время доступен).
Fragment — это сущность, позволяющая инкапсулировать часть интерфейса и его логику для переиспользования. Фрагменты были представлены в Android 3.0 и позволили существенно упростить работу по проектированию интерфейса для устройств с различными размерами экранов (так называемая парадигма Responsive Design, когда одно и то же приложение выглядит по разному на устройствах с различной диагональю экрана).
Фрагменты очень удобны и обладают следующими основными свойствами:
Очень похожи на Activity и имеют схожий цикл жизни, при этом дополненный несколькими событиями;
Как и Activity инкапсулируют логику работы с интерфейсом;
Могут жить только внутри Activity, при этом один и тот же фрагмент может быть использован в различных Activity, что существенно упрощает задачу при проектировании интерфейса для различных устройств.
Фрагменты обладают ещё одним свойством, которое может быть весьма полезно при разработке приложений — фрагмент можно создать вовсе без пользовательского интерфейса и заставить его не умирать при пересоздании родительской Activity. Это свойство может быть очень к месту для хранения источника данных (модели) в таком фрагменте.
Для многих начинающих разработчиков, пришедших с десктопных платформ, может стать настоящим откровением поведение Android например при изменении ориентации устройства — в таком случае Activity будет уничтожена и создана вновь с лэндскейпным лэйаутом. Соответственно если к Activity привязан какой-либо источник данных — он будет так же пересоздан (или перезагружен, в случае ContentProvider).
Чтобы этого не произошло можно создать специальный фрагмент без UI и передать в его конструкторе значение true в сеттер setRetainInstance (Java), либо установить значение true свойству RetainInstance (C#). Далее инициализировать и сохранить в нём нашу модель.
Все, после подобных манипуляций получим постоянный доступ к модели с сохранением её состояния даже при пересоздании родительской Activity.
Ниже небольшой пример кода на C# и Xamarin:
/// <summary>
/// Фрагмент без интерфейса, будет хранить нашу модель
/// (данный фрагмент будет ретейниться после уничтожения основной вьюхи и наши данные не будут перегенериваться при пересоздании Activity)
/// </summary>
public class ModelHolderFragment : Android.App.Fragment{
public static string SearchTag = "MODEL_HOLDER_FRAGMENT";
public ViewPagerItem[] DataSourceItems { get; private set;}
public override void OnCreate (Bundle savedInstanceState)
{
base.OnCreate (savedInstanceState);
DataSourceItems = GenViewPagerItems ();
//установим флаг, который запретит фрагменту умирать при уничтожении основной вьюхи
RetainInstance = true;
}
/// <summary>
/// Генерация фейковых данных
/// </summary>
/// <returns>The view pager items.</returns>
private ViewPagerItem[] GenViewPagerItems(){
...
return items;
}
}
///Хэндлер события OnCreate родительской Activity - тут создадим экземпляр нашего фрагмента
protected override void OnCreate(Bundle savedInstanceState) {
base.OnCreate(savedInstanceState);
SetContentView (Resource.Layout.activity_main);
//инициализируем фрагмент без интерфейса для хранения модели только при первом создании вьюхи
if (savedInstanceState == null) {
FragmentManager.BeginTransaction ().Add ((Android.App.Fragment)new ModelHolderFragment (), ModelHolderFragment.SearchTag).Commit();
FragmentManager.ExecutePendingTransactions ();
}
_model = (ModelHolderFragment)FragmentManager.FindFragmentByTag (ModelHolderFragment.SearchTag);
}