вторник, 15 октября 2013 г.

Новое достижение

Буквально вчера моя программа Таблица Менделеева заняла первое место в разделе Образование в российском Google Play. Для меня лично это большое достижение, потому что последний раз я попадал во Featured в 2008 году. Кстати, также моя программа Moscow Ticket Info привлекла внимание российского Google и они добавили ее в подборку В пути.





среда, 9 октября 2013 г.

Новый домен для книги

Я все-таки решил постепенно писать книгу и постараюсь уделять этому время, хотя бы один раз в неделю. Ссылка на блог книги http://bit.ly/19wFJJh. Формат ведения блога следующий, я буду писать некоторые заметки в блог и потом формировать из них главы книги. Книга позиционируется, как сборник рецептов, а не полностью книга для новичков. Причем рецепты будут, как для новичков, так и для более продвинутых программистов.

понедельник, 27 мая 2013 г.

Google I/O 2013 и поездка в Америку

Недавно мне удалось исполнить свою мечту, побывать в Америке и заодно на Google I/O 2013.
Фотографии (пока без макро) выложил в Google Photos. Отдельной ссылкой позже дам ссылку на видео и макросъемку.

Я уже давно начал писать статью по использованию ActionBar, но все никак нет времени ее закончить, надеюсь вы скоро ее увидите :) Она будет опубликована тут и в блоге http://androidbook.wordpress.com/.

пятница, 19 апреля 2013 г.

Реинкарнация

Давно я тут не писал :) Меня вообще кто-то читает? Я решил возобновить ведение этого блога по причине привязки его к Google+.

четверг, 27 января 2011 г.

Финальная статья по Toast

Пока моя книга пишется не очень быстро, но недавно немного переделал статью по Toast и добавил исходные коды. Тут свежая версия. И кстати пока решил не делать статьи в PDF это много времени занимает. Так что все будет в онлайне на сайте книги.

четверг, 23 сентября 2010 г.

Баг в Android или проблема Spinner в полноэкранном режиме

Вчера мой знакомый Максим Уханов написал мне в GTalk по поводу одной необычной проблемы. Он разрабатывает некое полноэкранное приложение, которое вызывает диалог c виджетом Spinner. И все было бы классно, но проявился баг - при нажатии на Spinner в полноэкранном режиме при появлении диалога выбора на 1-2 секунды появляется Status Bar. Это ситуация возникает в том случае, если в Spinner располагается большое количество элементов. Выглядит это примерно так:


Я начал исследовать исходные коды Spinner и обнаружил, что при отображении диалога с элементами при нажатии на Spinner создается диалог, который не учитывает вариант полноэкранного отображения. Выглядит код следующим образом.
@Override
public boolean performClick() {
boolean handled = super.performClick();
if (!handled) {
handled = true;
Context context = getContext();
final DropDownAdapter adapter = new DropDownAdapter(getAdapter());
AlertDialog.Builder builder = new AlertDialog.Builder(context);
if (mPrompt != null) {
builder.setTitle(mPrompt);
}
mPopup = builder.setSingleChoiceItems(adapter,
getSelectedItemPosition(), this).show();
}
return handled;
}

В голову пришло только одно решение, это создать свой класс на основе Spinner и перекрыть его метод performClick(). Но сложность заключается в том, что ссылка на диалог Spinner сохраняется в приватной переменной mPopup. Эту проблему мы обошли, используя рефлексию для доступа к этой переменной после создания диалога и вызова необходимого метода для установки свойств диалога для корректного отображения его в полноэкранном режиме. Чтобы повысить безопасность использования такого метода решения нашей проблемы, мы абстрагировались от названия поля mPopup и просто по циклу ищем переменную типа AlertDialog, таким образом даже если разработчики поменяют название переменной, наш код будет работать. Ниже представлен код нового класса:
package maximyudin.spinnerbug;

import java.lang.reflect.Field;

import android.app.AlertDialog;
import android.content.Context;
import android.util.AttributeSet;
import android.view.WindowManager;
import android.widget.Spinner;

public class NoTitleSpinner extends Spinner {
public NoTitleSpinner(Context context, AttributeSet attrs, int defStyle) {
super(context, attrs, defStyle);
}

public NoTitleSpinner(Context context, AttributeSet attrs) {
super(context, attrs);
}

public NoTitleSpinner(Context context) {
super(context);
}

@Override
public boolean performClick() {
boolean status = super.performClick();
Field privateStringField = null;
try {
Field[] fields = Spinner.class.getDeclaredFields();
for (Field field : fields) {
if (field.getType().getName().equals(AlertDialog.class.getName())) {
privateStringField = field;
break;
}
}
if (privateStringField == null) {
return false;
}

privateStringField.setAccessible(true);
AlertDialog dialog = (AlertDialog) privateStringField.get(this);
dialog.getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN,
WindowManager.LayoutParams.FLAG_FULLSCREEN);
} catch (IllegalArgumentException e) {
} catch (IllegalAccessException e) {
}
return status;
}
}

Теперь вам вместо Spinner надо в коде и в xml использовать наш NoTitleSpinner.
Полностью код проекта выложен тут.

P.S. Мы добавили этот баг в баг-репорт - следите за новостями тут - http://code.google.com/p/android/issues/detail?id=11419

вторник, 3 августа 2010 г.

Обзор Gigabyte GSmart G1305 (Codfish)

Некоторое время назад ко мне на тестирования попал тестовый образец первого смартфона от Gigabyte - GSmart G1305. По внешнему виду он меня изначально сильно испугал. Выглядел, как некачественная китайская подделка. Но после пристального рассмотрения аппарат показался мне довольно интересным.



Сразу, что бросилось в глаза - это сильно пачкающийся экран, на первой фотографии это хорошо заметно. Для начала приведу небольшую характеристику девайса. Аппарат базируется на ОС Android 1.6 (говорят будет апдейт до 2.1). Процессор у устройства довольной неплохой для такой ценовой категории - 600 МГц (Qualcomm MSM7227). Постоянная и оперативная память по 256 Мб, есть поддержка Bluetooth 2.0, Wi-Fi (802.11b/g), GPS. Девайс оснащен сенсорным экраном в 3,2 дюйма и 5 Мп камерой (с автофокусом и фотовспышкой). Также, что не маловажно, есть трекбол. Многие считают этот элемент управления бесполезным, но он очень удобен при навигации в ландшафтном режиме.