Android: Integer vs int

Паскальное детство даёт о себе знать. Так уж получилось, что Паскаль у меня был первым осмысленным языком программирования. И единственным на целый год. Потому что через год, перейдя на C, я стал смотреть на Паскаль как на нечто несерьёзное. И сейчас считаю Паскаль и его диалекты навроде Delphi, который с некоторых пор официально называется именно “язык Delphi”, а не “Object Pascal”, детскими игрушками не для серьёзного применения. И вопли о том, что дескать Скайп или еще какая-нибудь широко распространённая приблуда на нём написаны меня не волнуют.

Так вот, написав предыдущий пост я задумался, а почему я там пишу Integer, а не int, который я тоже видел в листингах программ для Андроида. Полез в документацию – оказалось, что Integer – это класс-оболочка для int. Это означает, что если нужна переменная целочисленного типа, принимающая значения в известных пределах, то можно использовать и int, вот только у Integer есть неоспоримое преимущество в наличии нескольких весьма полезных публичных методов – те же parseInt или toString, которые я чувствую придётся применять довольно часто.

Android: SharedPreferences

Полдня потратил, чтобы врубиться в класс SharedPreferences для Андроида.
Вот что пишут везде.

Во-первых в Activity нужна public static final константа, характеризующая набор настроек (которых может быть много разных):
public static final String MY_PREFERENCES = "MyPrefs";

Для сохранения общих настроек приложения нужен вот такой код:
SharedPreferences settings = getSharedPreferences(MY_PREFERENCES,0);
SharedPreferences.Editor prefEditor = settings.edit();
prefEditor.putString("FirstString", "abcdefg");
prefEditor.putInt("SecondString", 55);
prefEditor.commit();

В данном коде производится сохранение в общих настройках двух переменных – типа String и типа Integer. Вообще, класс SharedPreferences – это офигенно удобно, во всяком случае с первого взгляда. Настройки сохраняются, программа закрывается, открывается, настройки загружаются. Не надо думать куда же они сохраняются – Android берет это на себя.

Для загрузки их же при старте приложения (или конкретного Activity, чьи настройки нужны) в методе onCreate прописывать надо:
SharedPreferences settings = getSharedPreferences(MY_PREFERENCES,0);
String str1;
Integer i2;

if(settings.contains("FirstString")){
str1 = settings.getString("FirstString", "");
}else
{
str1 = "";
}

if(settings.contains("SecondString")){
i2 = settings.getInt("SecondString", 0);
}
else
{
i2 = 0;
}

Вроде бы всё работает. Вот только сохранять в настройки фиксированные значения неинтересно и не нужно никогда. А поэтому нужно использовать преобразования типов. Вот такие:

Чтобы преобразовать из Integer в String:

Integer a;
String str;
str = Integer.toString(a)

Преобразовать из String в Integer:

Integer a;
String str;
a = Integer.parseInt(str);

Интересная особенность контролов в Java: чтобы к примеру взять строку из контрола EditText и преобразовать её в Integer нужно сделать следующее:

Integer i;
EditText text;
text = (EditText) findViewById(R.id.editText1);
i = Integer.parseInt(text.getText().toString());

Забавно здесь то, что метод getText() у EditText’а возвращает нифига не String, а объект класса android.text.Editable – чтобы получить из него String и нужен вызов метода toString().

App Inventor: впечатления

На секунду смалодушничал и попробовал написать программу под Андроид на Google App Inventor. Ну, “написать” это громко сказано, потому что эта среда разработки просто квинтэссенция визуального проектирования. В прямом смысле – код не пишется, он рисуется визуальными блоками. Непривычно и забавно. Но ощущение гадливое, как будто делаешь что-то неприличное. Для вау-эффекта для простейших приложений сгодится, но писать там что-то достаточно серьёзное практически нереально – внимание рассеивается на эти визуальности. Из глюков нашёл только невозможность копи-паста в редакторе блоков – в моём случае на системе с неустановленной раскладкой я не мог создать текстовую переменную на китайском. Из плюсов – офигенная скорость работы плюс возможность подключить телефон и в прямом эфире наблюдать и пробовать на нём всё, что рисуется на компе.

Пошёл читать книжки, потому что надо осваивать нормальную Яву и не рассчитывать на эту поделку.

Android SDK

Вот честно, я думал, что подобные проблемы остались где-то в далёком прошлом. Что я могу ставить программу в любую директорию и не думать о том есть ли пробелы в пути. Но нет. Поставил свежий Eclipse, поставил Android SDK – всё поставил в рекомендуемые папки, не стал ничего выдумывать. Сижу, разбираюсь с программированием под Андроид, пытаюсь запустить в эмуляторе откомпилированную программу и что же я вижу в консоли?

invalid command-line parameter: Files.

Думаю, что ж за фигня-то? Открываю Android SDK and AVD Manager и что же я вижу там в разделе Installed Packages? Правильно.

Кто-то где-то поленился поставить кавычки… В директории с SDK лежат bat-файлы. Здравствуйте, девяностые… Придётся переинсталлить SDK куда-нибудь в корень диска в директорию с коротким именем. Потому что переключаться с мысли и искать что и где там незаэкранировано как-то уж очень лениво.

Забавности в повседневном САПР

В P-CAD PCB, где мы разводим платы, в меню File есть две подменюшки. Одна – Close, другая – Clear. PCB – это MDI-приложение, но с одной особенностью – всегда должен быть открыт документ, пусть даже и Untitled :)
Отличие File->Close от File->Clear вот так сразу и не видны. Когда в приложении открыт только один файл они совершенно равнозначны. Понятие MDI-приложения подразумевает возможность открытия нескольких файлов в одном окне приложения. И, если честно, за фанатичное следование парадигме MDI следовало бы отрубать руки и делать лоботомию программисту. Потому что, например, Excel (из 2003-го Офиса) определяет наличие себя в памяти при запуске (уж не знаю как – атом ставит или просто перебирает по именам) и открывает файл внутри уже запущенной копии. При этом на панели задач всё-равно _не_ одна кнопка, но развернуть один лист на полный экран на одном мониторе, а другой – на другом при этом становится невозможно. Но это я отвлёкся.
Если в P-CAD PCB открыто несколько дизайнов плат, то File->Close закрывает текущий, а File->Clear еще и открывает вместо него новый дизайн. Причём, сохраняет при этом расположение и размеры окна. Не знаю где это может пригодиться, но почему бы и нет. Лично я предпочитаю открывать дизайны плат каждый в своей копии PCB, благо на это действие никаких хуков не стоит.