2016-08-18 109 views
2

編輯:的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); 

================================================= ====================

原帖:

我試圖用着色FireMonkey/RAD Studio中製作一個Android應用程序的狀態欄。

爲了實現它在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庫:

#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

你沒有正確使用Embarcadero的JNI包裝類。翻譯一下會更喜歡這個:

_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 

然而,隨着中說,英巴卡迪諾的JWindow接口的定義不包括Window.setStatusBarColor()方法這是在API等級21加(安卓5,棒糖)。因此,除非您在自己的代碼中爲Window類手動定義了自己的JNI接口,否則在C++ Builder中將無法調用setStatusBarColor(),除非您訴諸於Java代碼中的調用是由您的C++調用的代碼或使用反射。

:除非它被添加到10.1柏林,我沒有安裝它。它不在10.0西雅圖。

+0

setStatusBarColor()現在在我使用的10.1中可用。 下面的代碼將無法正常工作 '窗口 - > clearFlags(TJWindowManager_LayoutParams :: JavaClass-> FLAG_TRANSLUCENT_STATUS);' 它會導致異常'只有原來的線程 創建視圖層次可以觸摸它views.' 相反,我試過: 'ANativeActivity_setWindowFlags(PANativeActivity(System :: DelphiActivity),TJWindowManager_LayoutParams :: JavaClass-> FLAG ...' 在這一步我去掉了狀態欄的背景顏色 - 它是透明的,像這樣的導航欄(不幸),而且很可能將由空白動作條。 –

+1

「只有原始線程」的錯誤是不言而喻的。 Android UI與創建它們的線程上下文綁定在一起。您不能跨線程邊界訪問UI對象。如果您有一個工作線程試圖操作由主線程創建的UI,則必須委託給主線程進行該操作。 –