2016-08-18 2 views
2

EDIT:Android цвета статусных в Embarcadero RAD Studio, C++

мне удалось удалить текущий фон строки состояния (а также случайно фон навигационной панели), используя этот код

ANativeActivity_setWindowFlags(PANativeActivity(System::DelphiActivity), 
TJWindowManager_LayoutParams::JavaClass->FLAG_DRAWS_SYSTEM_BAR_BACKGROUNDS, 
TJWindowManager_LayoutParams::JavaClass->FLAG_TRANSLUCENT_STATUS); 

до сих пор не знаете, как добавить новый цвет фона

Это не будет работать:

_di_JWindow androidWindow = SharedActivity()->getWindow(); 
androidWindow->setStatusBarColor(17170432); 

= = = 0 ====================

Оригинальное сообщение:

Я пытаюсь раскрасить строку состояния андроид приложение сделано с FireMonkey/RAD Studio ,

Для достижения этого в Java я обычно использую этот код:

Window window = activity.getWindow(); 
window.clearFlags(WindowManager.LayoutParams.FLAG_TRANSLUCENT_STATUS); 
window.addFlags(WindowManager.LayoutParams.FLAG_DRAWS_SYSTEM_BAR_BACKGROUNDS); 
window.setStatusBarColor(activity.getResources().getColor(R.color.my_statusbar_color)); 

В RAD Studio Я пытаюсь сделать это как этот

Сначала я включаю Android в заголовке LIBS:

#ifdef __ANDROID__ 
#include <FMX.Helpers.Android.hpp> 
#include <Androidapi.JNIBridge.hpp> 
#include <Androidapi.JNI.Os.hpp> 
#include <Androidapi.JNI.JavaTypes.hpp> 
#include <Androidapi.JNI.GraphicsContentViewText.hpp> 
#include <Androidapi.JNI.Util.hpp> 
#include <Androidapi.JNI.App.hpp> 
#include <Androidapi.JNI.Embarcadero.hpp> 
#include <Androidapi.Jni.hpp> 
#endif 

Тогда, когда я пытаюсь позвонить:

JWindow androidWindow = JNativeActivity::getWindow(); 

я получаю более 100 ошибок, как следующее:

[bccaarm Error] HeaderFooterTemplate.cpp(67): call to non-static member function without an object argument 
[bccaarm Error] HeaderFooterTemplate.cpp(67): variable type 'Androidapi::Jni::Graphicscontentviewtext::JWindow' is an abstract class 
    sysmac.h(327): unimplemented pure virtual method 'QueryInterface' in 'JWindow' 
    sysmac.h(328): unimplemented pure virtual method 'AddRef' in 'JWindow' 
    sysmac.h(329): unimplemented pure virtual method 'Release' in 'JWindow' 
    Androidapi.JNI.JavaTypes.hpp(763): unimplemented pure virtual method 'equals' in 'JWindow' 
    Androidapi.JNI.JavaTypes.hpp(764): unimplemented pure virtual method 'getClass' in 'JWindow' 
    Androidapi.JNI.JavaTypes.hpp(765): unimplemented pure virtual method 'hashCode' in 'JWindow' 
    Androidapi.JNI.JavaTypes.hpp(766): unimplemented pure virtual method 'notify' in 'JWindow' 
    Androidapi.JNI.JavaTypes.hpp(767): unimplemented pure virtual method 'notifyAll' in 'JWindow' 
    Androidapi.JNI.JavaTypes.hpp(768): unimplemented pure virtual method 'toString' in 'JWindow' 
    Androidapi.JNI.JavaTypes.hpp(769): unimplemented pure virtual method 'wait' in 'JWindow' 
    Androidapi.JNI.JavaTypes.hpp(770): unimplemented pure virtual method 'wait' in 'JWindow' 
    Androidapi.JNI.JavaTypes.hpp(771): unimplemented pure virtual method 'wait' in 'JWindow' 
    Androidapi.JNI.GraphicsContentViewText.hpp(18831): unimplemented pure virtual method 'addContentView' in 'JWindow' 
    Androidapi.JNI.GraphicsContentViewText.hpp(18832): unimplemented pure virtual method 'addFlags' in 'JWindow' 
    Androidapi.JNI.GraphicsContentViewText.hpp(18833): unimplemented pure virtual method 'clearFlags' in 'JWindow' 
    Androidapi.JNI.GraphicsContentViewText.hpp(18834): unimplemented pure virtual method 'closeAllPanels' in 'JWindow' 
    Androidapi.JNI.GraphicsContentViewText.hpp(18835): unimplemented pure virtual method 'closePanel' in 'JWindow' 
    Androidapi.JNI.GraphicsContentViewText.hpp(18836): unimplemented pure virtual method 'findViewById' in 'JWindow' 
    Androidapi.JNI.GraphicsContentViewText.hpp(18837): unimplemented pure virtual method 'getAllowEnterTransitionOverlap' in 'JWindow' 

Это мои первые шаги с C++, так что я не уверен, что я делаю это правильно.

ответ

2

Вы не используете классы оболочки JNI Embarcadero правильно. Перевод будет выглядеть следующим образом, вместо:

_di_JActivity activity = SharedActivity(); 
// or: _di_JActivity activity = TAndroidHelper::Activity; 

_di_JWindow window = activity->getWindow(); 
window->clearFlags(TJWindowManager_LayoutParams::JavaClass->FLAG_TRANSLUCENT_STATUS); 
window->addFlags(TJWindowManager_LayoutParams::JavaClass->FLAG_DRAWS_SYSTEM_BAR_BACKGROUNDS); 
window->setStatusBarColor(activity->getResources()->getColor(...)); 
// I don't know how to translate R.color.my_statusbar_color 

Однако, с учетом сказанного, определение Embarcadero по интерфейсу JWindow не включают Window.setStatusBarColor() метод , который был добавлен в API Level 21 (Android 5, Леденец). Таким образом, если вы не вручную определяете свой собственный интерфейс JNI для класса Window в своем собственном коде, вы не сможете вызвать setStatusBarColor() в C++ Builder, если вы не прибегнете либо к вызову в коде Java, который вызван вашим C++ кода или использовать Reflection.

: если только он не был добавлен в 10.1 Берлин, который я не установил. Его нет в 10.0 Сиэтле.

+0

setStatusBarColor() теперь доступен в 10.1, который я использую. Следующий код не будет работать 'window-> clearFlags (TJWindowManager_LayoutParams :: JavaClass-> FLAG_TRANSLUCENT_STATUS);' Это вызывает исключение 'Только оригинальная нить , который создал иерархию вида может коснуться его views.' Вместо этого я попытался: 'ANativeActivity_setWindowFlags (PANativeActivity (System :: DelphiActivity), TJWindowManager_LayoutParams :: JavaClass-> FLAG ...' На этом этапе я получил фоновый цвет удаляемой панели состояния - он прозрачен, так как панель навигации (к сожалению) и, вероятно, добавляет пустой ActionBar. –

+1

Ошибка «только из исходной темы» довольно понятна. Android UI привязаны к контексту потока, который их создает. Вы не можете получить доступ к объектам пользовательского интерфейса через границы потоков. Если у вас есть рабочий поток, который пытается манипулировать пользовательским интерфейсом, созданным основным потоком, вы должны делегировать основной поток для этой манипуляции. –