LINUX.ORG.RU

Убираю status bar. Всё перекрашивается в странные цвета.

 ,


3

2

Задача: убрать status bar и ничего не сломать.
Нюанс: Использую Qt, поэтому могу это сделать лишь из Manifest.xml.
Итого прописываю:

android:theme="@android:style/Theme.NoActionBar.Fullscreen"

Получаю: status bar действительно скрывается, но цвета плывут. Похоже на то, что Андроид мне подсовывает какую-то тёмную тему. А я хочу чтобы он просто никуда не лез и ничего не трогал, а просто убрал то, что приказано.
В общем что мне делать?

★★☆

Такое заклинание сработало:

android:theme="@android:style/Theme.Material.Light.NoActionBar.Fullscreen"

Stahl ★★☆ ()

В QtActivity.java добавить:

getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN, WindowManager.LayoutParams.FLAG_FULLSCREEN);
requestWindowFeature(Window.FEATURE_NO_TITLE);
EXL ★★★★★ ()
Ответ на: комментарий от Stahl

Ущербный костыль, так как скин Material.Light недоступен на Android < 4.4.4

EXL ★★★★★ ()
Ответ на: комментарий от EXL

QtActivity.java

А где этот файл вообще? Не вижу такого...

Stahl ★★☆ ()
Ответ на: комментарий от Stahl

А где этот файл вообще? Не вижу такого...

Он создаётся при сборке APK-пакета. В Qt достаточно сложный и наркоманский деплой, и из-за таких шагов с сторону как у тебя, в этот файл приходится залезать.

Чтобы была возможность в нём что-либо изменить, нужно зайти в каталог сборки APK-пакета, взять оттуда папочку android-build и переместить её в каталог проекта. Затем в PRO-файл добавить:

ANDROID_PACKAGE_SOURCE_DIR = $$PWD/android-build

И после этого отредактировать project-dir/android-build/src/org/qtproject/qt5/android/bindings/QtActivity.java, добавив в

@Override
public void onCreate(Bundle savedInstanceState)
{
...
}

Код выше.

Тут подробнее: http://doc.qt.io/qt-5/deployment-android.html
А тут пример такого использования: https://github.com/A780/Kinamania

EXL ★★★★★ ()
Ответ на: комментарий от EXL

Хм. Ничего себе. А я ведь просто хотел убрать статусбар. Спасибо, полез читать.
P.S. Проще, наверное, Яву выучить, чем при каждом шаге так спотыкаться с Qt:)

Stahl ★★☆ ()
Ответ на: комментарий от Stahl

Ещё можно через стили, изменив в AndroidManifest.xml тему на:

android:theme="@style/AppTheme"

А потом сделать в android-build папочку res, а в ней папки values, values-v11, values-v14, values-22, в которых будут файлы styles.xml с таким содержимым:

<?xml version="1.0" encoding="utf-8"?>
<resources>

    <style name="AppBaseTheme" parent="@android:style/Theme.Black.NoActionBar.Fullscreen"></style>

    <!-- Application theme. -->
    <style name="AppTheme" parent="AppBaseTheme"></style>

</resources>

Соответственно,

v11 — Theme.Holo.NoActionBar.Fullscreen
v14 — Theme.DeviceDefault.NoActionBar.Fullscreen
v22 — Theme.Material.NoActionBar.Fullscreen

Подробнее см. этот проект: https://github.com/EXL/AstroSmash/tree/master/res

EXL ★★★★★ ()
Ответ на: комментарий от EXL

Нихрена.
Вообще. Это точно работает на новых версиях?
Почему только 11,14,22? Он «интерполирует» на другие версии?

Stahl ★★☆ ()
Последнее исправление: Stahl (всего исправлений: 1)
Ответ на: комментарий от Stahl

Нихрена.
Вообще. Это точно работает на новых версиях?

А в APK/res точно имеются эти самые values папки с 11,14,22? Посмотри внимательное архиватором нормально ли собирается.

Он «интерполирует» на другие версии?

Да. Это разворачивается так:

API 0-11: Theme.Black.NoActionBar.Fullscreen
API 11-14: Theme.Holo.NoActionBar.Fullscreen
API 14-22: Theme.DeviceDefault.NoActionBar.Fullscreen
API 22-...: Theme.Material.NoActionBar.Fullscreen

EXL ★★★★★ ()
Ответ на: комментарий от EXL

Забавно получается:
в <директория_для_сброки>/android-biuld правильный res — туда всё скопировалось.
А вот в <директория_для_сброки>/android-biuld/bin res уже пустой.
Эти директории точно не нужно нигде прописывать?

Stahl ★★☆ ()
Ответ на: комментарий от Stahl

В PRO-файл директорию android-build нужно прописать, выше написал как.

EXL ★★★★★ ()

Нюанс: Использую Qt, поэтому могу это сделать лишь из Manifest.xml.

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

Или ты можешь из плюсов подёргать методы андроида, это тоже просто.

Но вполне возможно, что тебе и правки манифеста помогут.

ChALkeR ★★★★★ ()
Ответ на: комментарий от EXL

Котятам повезло, что сейчас для них не сезон. Я с удовольствием убил бы 5-6... Вот так взял бы в кулак и сдавил чтобы кровь, говно и кишки сквозь пальцы полезли.

В общем странная ситуация.
<исходники>/android/res директория копируется в <сборка>/android-build/res в полном объеме (т.е. поддиректории values тоже).
Однако из <сборка>/android-build/res в <сборка>/android-build/bin/res копируются лишь директории с пиктограммами. И то лишь потому, что я прописал в Манифесте: android:icon=«@drawable/icon
А вот директории values уже не копируются. Соответственно не попадают и в apk.

Я устал. Это просто издевательство какое-то...

Stahl ★★☆ ()
Ответ на: комментарий от Stahl

Я устал. Это просто издевательство какое-то...

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

ertgblasd ★★ ()
Ответ на: комментарий от ChALkeR

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

Или ты можешь из плюсов подёргать методы андроида, это тоже просто.

http://wstaw.org/m/2016/12/13/14222027796038.jpg

EXL ★★★★★ ()
Ответ на: комментарий от ertgblasd

Тем более что на плюсы она очень сильно похожа.

Ржали всеми дженериками.

Pavval ★★★★★ ()
Ответ на: комментарий от EXL

Вроде ж есть какая-то гугловская библиотека совместимости.

KivApple ★★★★★ ()
Ответ на: комментарий от KivApple

гугловская библиотека совместимости

Не думаю, что её будет просто прикрутить к Qt. Есть более «„„„„„простое“““““» средство, описанное в документации, то бишь подмена автосгенерированного QtActivity.java на свой. Вот им и нужно воспользоваться, как по мне. А support-либы ещё и жирные, около 2МБ. Впрочем для APK с Qt, в котором любая кнопка занимает 8МБ, это не так уж страшно.

EXL ★★★★★ ()
Ответ на: комментарий от EXL

Ну да. Эта библиотека по сравнению с весом Qt считай ничего не весит. Внутри этой библиотеки помимо прочего есть описания стилей, которые маппятся на разные системные стили в зависимости от версии ОС. Так что автор мог бы просто прописать его в манифесте, а остальные части этой библиотеки не использовать.

Конечно, это возможно из пушки по воробьям - тащить 2 МБ библиотеку только ради стиля, но вдруг это проще для ТСа, чем редактировать Java-код, откуда я знаю.

KivApple ★★★★★ ()
Ответ на: комментарий от Pavval

Базовый синтаксис похоже, поэтому плюсовик сможет въехать быстро, тем более что джавка гораздо проще

ertgblasd ★★ ()
Последнее исправление: ertgblasd (всего исправлений: 1)
Ответ на: комментарий от ertgblasd

Базовый синтаксис похоже

Когда синтаксис вообще был проблемой?

Pavval ★★★★★ ()
Ответ на: комментарий от EXL

EXL, а можно тебя ещё поспрашивать? Ты, кажется, не одну собаку съел с Андроидом и Qt.
Я воспользовался предложенным тобой методом по копированию QtActivity.java. Работает.
Но хотелось бы довести до красивого варианта. А проблема такая:
Стили. При первом запуске программы, к ней применяются «native» стили, которые не только ужасны сами по себе, так ещё и рендерятся коряво, да ещё и слетают при повторном запуске.
Что я хочу: чтобы программа сразу запускалась с Qt-стилем.
Очевидное

public String ENVIRONMENT_VARIABLES = "QT_USE_ANDROID_NATIVE_DIALOGS=0";

не привело ни к какому заметному эффекту.
Не подскажешь как заставить программу выглядеть как Qt программа, а не пытаться мимикрировать под Андроид?

Stahl ★★☆ ()
Ответ на: комментарий от Stahl

А ты пробовал в main.cpp сделать что-то вроде

qputenv("QT_USE_ANDROID_NATIVE_DIALOGS", "0");

?

EXL ★★★★★ ()
Ответ на: комментарий от EXL

Попробовал. Без эффекта.
Меня смущает такой код:

@Override
    public void onCreate(Bundle savedInstanceState)
    {
       ...
		m_loader.QT_ANDROID_THEMES = QT_ANDROID_THEMES;
		m_loader.QT_ANDROID_DEFAULT_THEME = QT_ANDROID_DEFAULT_THEME;
      ...

    }

Когда я их заремировал, то получил что-то похожее на Qt, но совсем тёмно-серый и плоский.
Возможно это правильное направление, но что делать дальше я не знаю.

Stahl ★★☆ ()
Ответ на: комментарий от Stahl

Я в эту сторону не копал никогда. Когда я использовал Qt на Android, там вообще не было мимикрирующих тем, со всеми вытекающими.

EXL ★★★★★ ()
Ответ на: комментарий от EXL

Вот ведь времена были, а? Просто всё работало, а не пыталось подсунуть тебе свинью со словами: «Ну так же красивее!»:)
Ок, будем искать...

Stahl ★★☆ ()
Ответ на: комментарий от Stahl

Просто всё работало

Нет, я так не думаю. У Qt Widgets тогда были просто огромные проблемы с UX, к примеру, мизерные кнопочки в которые фиг попадёшь. Далее, были траблы с переключением контекста Canvas <-> OpenGL, были траблы со звуками из qrc-файлов, траблы с QSS-стилями, траблы с сетью, траблы с медленной отрисовкой и долгой загрузкой.

Никогда оно просто не работало. А потому у Qt-фреймворка и такая популярность. Не знаю ни одного приложения на Android, которое было бы выполнено на Qt Widgets.

EXL ★★★★★ ()
Ответ на: комментарий от EXL

Я сейчас разревусь, ей-богу. Это песец какой-то.
Нужно было сразу делать интерфейс на моём ASCII-движке, который я использую для игрушек.
И работало бы. И выглядело бы прикольно. Material. Да, говно это тоже материал, но не очень удачный ни для какого применения:(

Stahl ★★☆ ()
Ответ на: комментарий от Stahl

Возможно стоит посмотреть в сторону QtQuick/QML, или, лучше всего, на Java и Android SDK. Научиться клепать GUI-приложения там — дело двух-трёх дней.

EXL ★★★★★ ()
Ответ на: комментарий от EXL

Я нашёл! Эврика, мать её за ногу вместе с Архимедом и его ванной.
Одного QApplication::setStyle() было мало!
Нужно ещё QStyleFactory::create();
Кажется завелось. Нужно всё вычистить, пересобрать, но кажется работает!

Stahl ★★☆ ()
Последнее исправление: Stahl (всего исправлений: 1)
Ответ на: комментарий от EXL

были траблы со звуками из qrc-файлов

А что, уже починили? Я где-то год назад смотрел, оно не умело играть из ресурсов, приходилось копировать куда-нибудь.

CrossFire ★★★★★ ()
Ответ на: комментарий от CrossFire
_click = new QMediaPlayer;
_click->setMedia(QUrl("qrc:/sound/click.wav"));
_click->play();


Фурычит. Только тормозит. Думаю что нужно всё-таки загружать в память, а потом только играть.

Stahl ★★☆ ()
Ответ на: комментарий от EXL

На венде вообще весело, там если компилить MSVSC, и звуков много в ресурсах, оно не собирается из-за каких-то там ограничений.

P.S. Длина некоторых функций по ссылке поражает воображение.

CrossFire ★★★★★ ()
Ответ на: комментарий от CrossFire

и звуков много в ресурсах, оно не собирается из-за каких-то там ограничений.

Да, что-то такое было, тоже помню. Вроде лимит на количество элементов в массиве, или вообще C1060 из-за нехватки памяти линкеру.

EXL ★★★★★ ()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.