Конструкция “for each” в Java

Недавно задался вопросом, есть ли такая конструкция в Java. Ясного ответа сразу не нашел. Некоторые говорят на форумах, что нет, а некоторые говорят, что есть, но как-то хитро через коллекции. Так вот, привожу пример своего кода, в котором использован аналог “for each” в Java:

Elements links = doc.select("link");
for (Element link : links) {
      linksList.add(link.text());
      Log.v(TAG, "link:"+link.text());
}

Плагин WordPress для увеличения изображений (Plugin for resizing images on WordPress)

По умолчанию WordPress увеличивает картинку, открывая целую страницу либо в текущем, либо в новом окне. Я долго искал плагин, который бы позволял увеличивать изображение в той же странице. Изучив три плагина, я все таки нашел четвертый, который мне подошел. Итак, называется он Auto Thickbox Plugin For WordPress и скачать его можно на странице плагинов WordPress или на официальной странице, где я и скачал.

Кликните на следующую картинку, чтобы посмотреть, как это работает:

Отключение ARC для некоторых сорс-файлов (iOS)

Чтобы отключить ARC(Automatic Reference Counting) лишь для некоторых сорс-файлов, нужно прописать в Compiler Flags:

как показано на рисунке:

Важное замечание
Для того, чтобы отключить ARC сразу на нескольких сорс файлах, нужно их выделить, затем нажать Enter(а не 2 щелчка), ввести эту опцию и снова нажать Enter.

Как пользоваться iBooks

iBooks – очень полезное бесплатное приложение Apple для iOS, которое позволяет читать книги в форматах EPUB и PDF. Это наверно первое, что нужно устанавливать при покупке iPhone и особенно – iPad (если оно, конечно, уже не уставлено). Как это выглядит на iPhone:

Пользоваться iBooks просто. Например, можно скачать книги из iTunes Store, раздела Books:

и они появятся в Вашей медиатеке в разделе Books в iTunes.

Книги в форматах EPUB и PDF можно также импортировать в iTunes/Books, нажав Cmd+O или Файл->Добавить в медиатеку.

После этого, нужно просто синхронизировать раздел Books в устройстве с iOS с Вашей медиатекой iTunes/Books:

В итоге, мы получаем целую библиотеку на iOS устройстве в приложении iBooks.

Определение координат центра iPhone / iPad

Я относительно долго мучился, пытаясь создать код, который был бы унивесальным для iPhone и iPad и определял координаты центра экрана и координаты нижней части экрана. Это нужно было для того, чтобы позиционировать ActivityIndicatorView и AdView. Причиной мучений было то, что функция self.view.bounds работает некооректно на iPad и возвращает координаты прямоугольника такие же как на iPhone, хотя размер экрана другой. Итак, привожу код, по нему все понятно. Сначала я создаю объект CGSize screenSize и далее его использую для позиционирования Activity Indicator и iAd. Вычитаю 20.0 – это высота Status Bar; 44.0 – высота Navigation Bar; 50.0 – высота ADBannerView. У Вас в этом моменте может быть по другому, главное – принцип.

CGSize screenSize = [UIScreen mainScreen].bounds.size;
    // Универсальное определение центра iPhone / iPad
    CGFloat centerX = screenSize.width/2.0;
    CGFloat centerY = (screenSize.height - 20.0 - 44.0)/2.0;
    activity.center = CGPointMake(centerX, centerY);
    // Универсальное позиционирование рекламы внизу экрана iPhone / iPad
    CGFloat adWidth = screenSize.width;
    CGFloat adYCoordinate = screenSize.height - 20.0 - 44.0 - 50.0;
    NSLog(@"adWidth=%f, adYCoordinate=%f", adWidth, adYCoordinate);
    CGRect bannerFrame = CGRectMake(0, adYCoordinate, adWidth, 50.0);
    bannerView.frame = bannerFrame;

Как сделать приложение универсальным для iPhone / iPad

Универсальность приложения – это большой плюс, так как на iPad в таком случае приложение будет работать так же красиво, как на iPhone без масштабирования и как иногда говорят “пикселизации”. Кроме этого, поддерживать универсальное приложение удобнее, так как оно одно, в противном случае нужно поддерживать два разных приложения для двух платформ, что более трудоемко. А еще в App Store будет одна страница. Следовательно легче продвигать, комментарии все в одном месте и т.д. Есть и минусы универсальности. Сложные приложения проще сделать, наверное, в двух вариантах.

Для того, чтобы сделать приложение универсальным нужно учесть несколько аспектов или сделать несколько вещей.

  1. Заходим в Build Settings проекта и делаем поиск параметра Targeted Device Family. Выбираем опцию iPhone/iPad. См. рисунок. При щелчке он увеличивается.
  2. Создаем все необходимые заставки и иконки в нужных размерах. Для iPad размер заставки 768×1004 px, размер иконки 72х72 px. Для iPhone 360×460, иконка 57×57 для iPhone 3GS и ранее, 720х920, 114х114 соответственно для Retina display в iPhone 4 и выше. Если Вы не отображаете Status bar, то нужно прибавить еще 20 к высоте. Присваиваем все заставки и иконки во вкладке Summary для Вашего Target.
  3. Если какие-то XIB файлы View нужно переделать под iPad, то создаем эти XIB файлы. Для этого нажимаем правой кнопкой по папке Classes в проекте, New File -> User Interface -> View. Но просто создать XIB недостаточно. Нужно еще его File Owner присвоить значение нужного класса. См. Рисунок.

    Теперь у нас есть 2 XIB файла для одного View Controller: MainAboutViewController.xib и MainAboutViewControllerIPad.xib к примеру.
    В коде, там где вызывается этот контроллер, нужно сделать разветвление наподобие следующего:
    - (IBAction)showAboutScreen:(id)sender {
        NSString *nibName;
        if (UI_USER_INTERFACE_IDIOM() == UIUserInterfaceIdiomPad)
            nibName = @"MainAboutViewControllerIPad";
        else
            nibName = @"MainAboutViewController";
        MainAboutViewController *mainAboutViewController = [[MainAboutViewController alloc] initWithNibName:nibName bundle:nil];
        mainAboutViewController.modalTransitionStyle = UIModalTransitionStyleFlipHorizontal;
        mainAboutViewController.title = @"О приложении";
        [self presentModalViewController:mainAboutViewController animated:YES];
    }
  4. Во всех других участках, где нужно учитывать тип устройства пишем аналогичный код:
  5. Ссылки:
    Converting iPhone apps to universal

    A few more notes

Обновление ListView в Android

Мейнстрим решением для обновления ListView после изменения данных является использование метода arrayAdapter.notifyDataSetChanged(), где arrayAdapter – Ваш адаптер. Но к сожалению, это не всегда срабатывает.

Я использовал в своем случае другое решение, которое сработало – просто переопределял адаптер целиком. Теперь таблица обновляется после изменения данных в массиве, с которым она связана.

Парсим XHTML с помощью JSoup в Android

Расскажу о том, как можно распарсить XHTML или даже HTML с помощью JSoup в Android. Лично я парсил XHTML. Для этого нужно:

  1. Скачать jar файл JSoup библиотеки здесь.
  2. Подключить JSoup.jar к нашему проекту. Для этого нажимаем правой кнопкой на проект, далее выбираем Build Path->Configure Build Path.

    В появившемся окне нажимаем Java Build Paths, далее выбираем вкладку Libraries и добавляем через Add Jars.
  3. Создать объект класса Document, который, кстати, должен быть именно из Jsoup библиотеки, а не родных библиотек. Это можно выбрать при нажатии Shift+Cmd+O после того, как вы добавили код, использующий JSoup. Объект класса Document в данном случае создается из того, что подкачивается через URL. Далее с этим объектом можно работать. Например, в данном случае из него извлекаются все ссылки с тэгом а, и создается массив из ссылок и их атрибутов href. Сначала все добавляем в структуру ArrayList, затем ArrayList заносим в String[] массив. Все, что добавлено, пишется в LogCat через Log.v. В данном случае, метод doInBackground должен быть в составе класса AsyncTask, просто не хочу приводить весь код, это будет лишним.

Это лишь один из примеров использования JSoup. Возможностей у него много и здесь можно найти более подробное их описание.

Интернет через Proxy на симуляторе Android

В отличие от симулятора iPhone, эмулятору Android нужно объяснять, как ему выходить в интернет. Здесь речь пойдет о случае, когда вы работаете через Proxy.

Неработоспособность интернета на эмуляторе Android – общая проблема и широко обсуждается на StackOverflow. Я задал также свой вопрос там, но мне не смогли помочь, в итоге я сам же и ответил на свой вопрос.

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

Итак, последовательность действий, чтобы интернет у Вас заработал:

  • В Eclipse заходим в Run Configurations. См. рисунок. При нажатии он увеличивается.
  • Нажимаем на Target для нашего проекта. Прокручиваем вниз и вводим настройку Proxy в поле Additional Emulator Command Line Options. Я не знал, что нужно прокручивать, и искал это поле очень долго. В случае использования эмулятора версии 2.3.3. вводим

    Если вы используете эмулятор версии 4.0.3, то dns указывать не надо:

  • Нажимаем Apply, чтобы сохранить настройки и либо нажимаем Run здесь, либо просто запускаем проект как обычно. Обращаю внимание, что для дебага нужно прописать отдельно это же в Debug Configurations.

Данное решение хорошо тем, что оно не зависит от симулятора и настройки хранятся в Target в проекте, а не вне проекта. Но оно плохо тем, в отличие от решения которое я указал ранее, что нужно все время прописывать эти настройки для всех проектов и всех конфигураций.