Создание и управление интерфейсом на Android с Python. Часть 5.
Всем привет! После долгого перерыва связанным решил продолжить серию статей, посвященных разработке интерфейса под платформу Android на языке программирования Python. И сегодня мы, как всегда, будем опровергать распространенное мнение, что якобы до сих пор в проектах Python for Android (далее P4A) не построить приличного интерфейса, кроме как общение с пользователем посредством диалоговых окон. Так считают те, кто просто не умеет и, главное, не хочет учится и развиваться в этом направлении. На самом деле, в построении интерфейса P4A нет ничего сложного и, лично для меня, его программирование значительно проще и удобнее, чем на, ныне мертвой, платформе Symbian. Собственно, сегодняшняя статья и примеры в ней, в отличие от предыдущих, будут не демонстративно-показательны, а максимально приближены к работе реального приложения. Мы рассмотрим переключение layout-ов в приложениях P4A на примере разрабатываемого мною клиента "HeaTDV4A" для нашего сайта и заодно протестуем работу модуля pySetting (подробнее об эксплуатации модуля читайте в документации самого модуля).
Ранее, функцией fullShow("путь к макету") я подключал различные интерфейсы в одном скрипте. На моем старом устройстве это приводило к тому, что на секунду первый макет интерфейса исчезал, как будто бы приложение закрылось, и через секунду появлялся второй вызваный макет. Это было неприемлемо и эстетически некрасиво. Тогда я попробовал помещать подключение новых layout-oв в отдельные модули, после чего данная проблема была решена. На новом девайсе подобных траблов, связанных с миганием дисплея, я не замечал, однако с тех пор приучил себя разбивать вызовы макетов интерфейса на модули. Во-первых, это делает код намного читабельней и понятней как для других программистов, так и для вас самих. Во-вторых, если вы вызвали функцию fullShow и открыли второй макет интерфейса, чтобы вернуться к первому экрану, вам придется либо заново "рисовать" главный экран поверх второго, либо вызвать функцию fullDismiss. Во втором случае вы закроете все вызваные функцией fullShow макеты интерфейса, что, согласитесь, нам не нужно.
Итак, от слов к делу! Давайте "нарисуем" два макета интерфейса и попробуем вывести на экран сначала первый, а затем второй при условии, что второй макет находится в отдельном модуле.
# запрещаем создавать байт-компилированые версии модулей программы # так как приветствуем только открытый исходный код sys.dont_write_bytecode = True # корневая директория программы program_path = "%s/scripts/P4A/Example1" % os.getcwd() sys.path.append("%s/libs" % program_path)
import android # визуализация пользовательских настроек # в нашем случае это и будет подключение нового макета интерфейса import pySetting
droid = android.Android()
def showSetting(): """Выводит на экран меню настроек"""
# список пунктов настроек setting_list = \ [ "Автоподключение при старте", "Уведомлять о новых сообщениях", "Проверка обновлений", "Показывать новости сайта", "Показывать темы, где вы отвечали", "Изменить пароль" ] # цвет текста пунктов настроек text_color="#cccccc" # цвет подложки background_color="#000000" # высота изображения на экране size_img_title="80dp" # путь к изображению path_to_img = "%s/res/Drawable/labelsetting.jpg" % program_path
# экземпляр класса визуализации пользовательских настроек setting = pySetting.Setting( setting_list, "#cccccc", "#000000", "%s/res/Drawable/labelsetting.jpg" % program_path, "80dp") # возвращает словарь вида {"имя пункта": true" либо "false"} # "true" - пункт выбран и "false" - пункт не выбран result = setting.show()
def run(): # загружаем макет интерфейса droid.fullShow(open("%s/res/Layouts/home.xml" % program_path).read()) # устанавливаем изображение в верхней части экрана домашней страницы droid.fullSetProperty("up_bar", "background", "file://%s/res/Drawable/DV.jpg" % program_path)
# ожидание событий от пользователя while True: signal = droid.eventWait(50).result if signal: # проверка на принадлежность событий к выбору пунктов меню # если нажата клавиша "возврат" if signal['name'] == 'key' and signal['data']['key'] == '4': if exitProgram(): break # пункт меню "Настройки" elif signal['name'] == "setting": showSetting() # пункт меню "Выход" elif signal['name'] == "exit": if exitProgram(): break sys.exit(0)
def exitProgram(): # создаем окно диалога с двумя клавишам выбора droid.dialogCreateAlert("HeaTDV4A:", "Закрыть программу?") droid.dialogSetPositiveButtonText("Да") droid.dialogSetNegativeButtonText("Нет") droid.dialogShow()
response = droid.dialogGetResponse().result result = response[response.keys()[0]]
if result == 'positive': return True else: return False
run()
nur87, Никакой черной магии. Можно писать и result = response[\"which\"]. Код взят из моего модуля, и данная строка предотвращает ошибку KeyError, которая, как раз-таки, магическим образом иногда вылазит.
nur87, Никакой черной магии. Можно писать и result = response[\"which\"]. Код взят из моего модуля, и данная строка предотвращает ошибку KeyError, которая, как раз-таки, магическим образом иногда вылазит.
0 ответить