WebView.loadData() и спецсимволы.

Попробуем сделать следующее: загрузить в WebView html текста при помощи метода loadData() следующего содержания:

< html>
< body>Percent test: 100% < /body>
< /html>

@Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);

        String htmlText = "<html><body>Percent test: 100% </body></html>";
        WebView mWebView = (WebView) findViewById(R.id.webView);
        mWebView.loadData(htmlText, "text/html", "en_US");
    }

И посмотрим, что получится:

а всё потому что метод loadData() некорректно обрабатывает спецсимволы (в нашем случае символ процента «%»). Если его убрать из html-кода – получим корректную загрузку веб страницы:

Как вариант, тут можно воспользоваться другим методом loadDataWithBaseURL() с нуловыми параметрами для урла:

mWebView.loadDataWithBaseURL(null,htmlText, "text/html", "en_US", null);

Теперь получим корректное отображение страницы:

Рубрика: Разработка под Android | Добавить комментарий

Android Training

Google guys не так давно запустили проект Android Training, в котором обещают выкладывать «best practices» по разработке приложений (за что им большое спасибо!) Посмотрите, там можно найти много полезного и еще больше ожидается soon.

Рубрика: Разработка под Android | Добавить комментарий

Идея для «тяжелых» приложений

Если ваше Android приложение использует много «тяжелых» ресурсов (картинок и прочего), которые непомерно увеличивают размер приложения, почему бы не выполнить их загрузку из интернета при первом запуске программы? (естественно, если у вас есть для этого выделенный сервер). Таким образом, и приложение будет весить немного, а после первого запуска загрузит необходимые ресурсы и сохранит в памяти устройства, после чего ими можно буде пользоваться.

Рубрика: Разработка под Android | Добавить комментарий

Отображение карты (Map) внутри фрагмента (Fragment) в Android

Android Fragments API появились в версии Android 3.0 Honeycomb и предоставляет неплохую альтернативу масштабирования и отображения частей вашего приложения на устройствах с различными разрешениями экрана. Как писалось ранее, фрагмент в андроид представляет из себя независимую частичку, или если хотите, элемент Activity, со своим жизненным циклом. Про фрагменты можно почитать в оф. документации.
Сейчас бы хотелось рассмотреть следующий пример (думаю, довольно актуальный для приложений, написанных под планшетник и использующий Google Maps). Допустим, перед нами стоит задача – отобразить карту (MapView) внутри фрагмента (Fragment). Всё бы хорошо, только только есть одно но. А точнее два. Во-первых, каждый фрагмент приложения – это не отдельная Activity, а каждый отображаемый фрагмент является частью Activity и какбы живет своей жизнью внутри неё. Во-вторых существует ограничение, по которому создавать экземпляр MapView можно только внутри MapActivity. (MapViews can only be created inside instances of MapActivity). А вот отдельного компонента, такого как MapFragment к примеру, API не предоставляет (по крайней мере пока). Так что же делать? Как отобразить карту внутри фрагмента в андроид?. Немного погуглив можно найти пару решений.

Первое – предложенное неким пользователем inazaruk. Заключается оно в следующем:

1. MainFragmentActivity extends FragmentActivity (from support library) and has MapFragment;
2. MyMapActivity extends MapActivity and contain MapView;
3. LocalActivityManagerFragment hosts LocalActivityManager;
4. MapFragment extends LocalActivityManagerFragment and contains TabHost;
5. And this TabHost contains the only tab with MyMapActivity in it;

Если в двух словах, то он предлагает в корневой фрагмент положить табхост (наверное единственный компонент, который может хостить внутри себя другую активити). Также для него необходимо будет сделать setup() и назначить LocalActivityManager. Код примера находится на github. Пример вполне работоспособный, только вот LocalActivityManager помечен как deprecated.

Второй способ рассматривается вот в этой ветке в google groups. Заключается от в использовании (а точнее модицикации) FragmentActivity из библиотеки совместимости (compatibility library). Если коротко – то выкачивание и присоединение исходников этой библиотеки к проекту, а также модификация её при помощи нехитрого «финта ушами». Не знаю, насколько данный способ эффективен, так как там после модификаций необходимо будет фиксить compilation errors (восновном ошибки приведения типов), и во что это всё может вылиться – сложно предугадать.

Данное Issue 15347: Add support for MapFragment добавлено на google code.

Рубрика: Android Fragments | Добавить комментарий

Публикация платного приложения в Adoroid Market для Украины

Думаю, многих android-разработчиков из Украины интересует возможность выкладывать платные приложения на Android Market. И для этого необходимо иметь аккаунт продавца в Google Checkout:

Но к сожалению, для жителей Украины создание данного аккаунта пока невозможно: (Россия есть в списке)

Так что пока остается только ждать официально правильного способа зарегистрироваться, а пока ищем хороших знакомых «за бугром» или же выкладываем своё приложение на каком-то альтернативном сервисе наподобие Андроид Маркета.

Рубрика: Android Market | Добавить комментарий