2016-08-18 17 views
2

編集:私はこのコードAndroidのステータスバーの色、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アプリのステータスバーを色付けしようとしています。

#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 
:私は、ヘッダー内のAndroid LIBSを含め、この

まずようにそれをやろうとしているRAD Studioでは

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)); 

は、私は通常、このコードを使用して、Javaでそれを達成するために、その後

私が呼んしようとしている:

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インタフェースのエンバカデロの定義ははAPIレベル21で追加されましたWindow.setStatusBarColor()方法(アンドロイド5を含んでいません、ロリポップ)。そのため、コード内でWindowクラスの独自のJNIインターフェイスを手動で定義しない限り、Javaコードで呼び出しを行うことに頼らないかぎり、setStatusBarColor()をC++ Builderで呼び出すことはできません。コードを使用するか、Reflectionを使用します。

:私がインストールしていない10.1ベルリンに追加されていない限り、 10.0シアトルには存在しません。

+0

私は10.1でsetStatusBarColor()を使用できるようになりました。 次のコードは、(TJWindowManager_LayoutParams :: JavaClass-> FLAG_TRANSLUCENT_STATUS) 'ウィンドウ - > clearFlagsを動作しません;' それはそのviews.'に触れることができるビュー階層を作成した例外 'だけ元のスレッド を引き起こし 代わりに私は試みました: 'ANativeActivity_setWindowFlags(PANativeActivity(System :: DelphiActivity)、TJWindowManager_LayoutParams :: JavaClass-> FLAG ...' この段階で、ステータスバーの背景色が削除されました。透明で、ナビゲーションバーのように(残念ながら)、おそらく空白のActionBarが追加されます。 –

+1

「オリジナルスレッドのみ」のエラーは、わかりやすいものです。 Android UIは、それらを作成するスレッドコンテキストに関連付けられています。スレッド境界を越えてUIオブジェクトにアクセスすることはできません。メインスレッドによって作成されたUIを操作しようとしているワーカースレッドがある場合は、その操作のメインスレッドに委任する必要があります。 –

関連する問題