ステータスバーの例を使用したQtのネイティブAndroidおよびiOSコード

こんにちは Qtがクロスプラットフォームモバイルアプリケーション開発に非常に適していると聞いた人は多いと思います。 ただし、いくつかの問題を解決するには、ネイティブコード(Java、Objective-C)を処理する必要があります。たとえば、カメラ、ギャラリーの呼び出し、サードパーティのAPIの呼び出しなどです。







この記事では、ステータスバーの透明度を設定する簡単な例を使用して、ネイティブJavaコードとObjective-Cを呼び出す方法を示します。







強打する







アンドイド



透明なステータスバーを使用する機能は、 Android 4.4 KitKatで登場しました。 ステータスバーを透明にするには、プロジェクトのアクティビティで Windowの透明フラグを指定する必要があります(QMLの表示に使用されるQQuickWindowと混同しないでください)。







QtActivityからアクティビティをオーバーライドする方法がわからない場合

[プロジェクト]タブを開き、Andoidの下にアセンブリを追加→[アセンブリ]→[Android APKのビルド]→[テンプレートの作成]の[詳細]をクリックします。







したがって、AndroidManifestというリソースとgradleファイルを含むフォルダーを作成しました。これらは、androidフォルダーに配置されます。 javaクラスを配置するには、androidフォルダーにsrcフォルダーを作成します。







ファイルMyActivity.javaを作成します。 ファイルへのパスがパッケージ名と一致することが重要です。 com.example.myPackageというパッケージを使用する場合、パスはandroid / src / com / example / myPackage / MyActivity.javaである必要があります







package com.example.myPackage; import org.qtproject.qt5.android.bindings.QtActivity; import android.app.Activity; import android.os.Bundle; public class MyActivity extends QtActivity { @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); } }
      
      





次に、 AndroidManifest.xmlでアクティビティの名前を設定する必要があります。 探している







 android:name="com.example.myPackage.MyActivity"
      
      





に変更します







 android:name="org.qtproject.qt5.android.bindings.QtActivity"
      
      





これらの簡単な操作で、標準のQtActivityを再定義しました。







透明フラグステータスバーを設定する関数とそのアプリケーションの例:







 @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setTranparentStatusBar(); } void function setTranparentStatusBar() { if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT) { if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) { getWindow().addFlags(WindowManager.LayoutParams.FLAG_DRAWS_SYSTEM_BAR_BACKGROUNDS); getWindow().getDecorView().setSystemUiVisibility(View.SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN); getWindow().setStatusBarColor(Color.TRANSPARENT); } else { getWindow().setFlags(WindowManager.LayoutParams.FLAG_TRANSLUCENT_STATUS, WindowManager.LayoutParams.FLAG_TRANSLUCENT_STATUS); } }
      
      





ステータスバーの高さを返す関数:







 public int statusBarHeight() { if (Build.VERSION.SDK_INT < Build.VERSION_CODES.KITKAT) { return 0; } int result = 0; int resourceId = getResources().getIdentifier("status_bar_height", "dimen", "android"); if (resourceId > 0) { result = getResources().getDimensionPixelSize(resourceId); } return result; }
      
      





QMLからJavaクラスメソッドを呼び出すには、 JNIを使用するC ++クラスを記述する必要があります。 JNIを使​​用するには、Android モジュールを* .proファイルに追加します。







 QT += androidextras.
      
      





シングルトンクラスDeviceInfoを作成します。







DeviceInfo.h:







 #pragma once #include <QObject> class DeviceInfo : public QObject { Q_OBJECT Q_PROPERTY(int statusBarHeight READ statusBarHeight) public: DeviceInfo(QObject *parent = NULL); static DeviceInfo &instance(QObject *parent = 0); Q_INVOKABLE int statusBarHeight(); private: static DeviceInfo _instance; };
      
      





DeviceInfo.cpp:







 #include "DeviceInfo.h" #if defined(Q_OS_ANDROID) #include <QAndroidJniObject> #include <QtAndroidExtras> #include <QtAndroid> #endif DeviceInfo::DeviceInfo(QObject *parent) : QObject(parent) {} DeviceInfo &DeviceInfo::instance(QObject *parent) { static DeviceInfo instance(parent); return instance; } int DeviceInfo::statusBarHeight() { #if defined (Q_OS_ANDROID) QAndroidJniObject activity = QtAndroid::androidActivity(); jint height = activity.callMethod<jint>("statusBarHeight"); return (int) height; #endif return 0; }
      
      





次に、QMLでクラスを定義します。







 view.rootContext()->setContextProperty("DeviceInfo", &DeviceInfo::instance());
      
      





すべて準備が完了しました。QMLでstatusBarHeightメソッドを呼び出すだけです。







 Rectangle { width: parent.width height: DeviceInfo.statusBarHeight() }
      
      





画面上の結果:







アンドロイドのスクリーンショット







iOS



iOSのステータスバーに異なるスタイルを設定する機能は、 iOS 7.0で登場しました。 アプリケーションのステータスバーを透明にするには、3つのことを行う必要があります。







  1. info.plistを変更します。つまり、 UIViewControllerBasedStatusBarAppearanceキーを変更します。


 <key>UIViewControllerBasedStatusBarAppearance</key> <false/>
      
      





  1. QQuickViewまたはQQuickWindowを表示するには、show()の代わりにshowFullScreen()メソッドを使用します。


  1. ステータスバーをUIStatusBarStyleLightContentに設定します


最初の2つのポイントですべてが明確な場合、3番目のポイントをより詳細に分析します。 Objective-Cでは、次の方法でステータスバーのスタイルを変更できます。







 [[UIApplication sharedApplication] setStatusBarStyle:UIStatusBarStyleLightContent];
      
      





ステータスバーの高さを返す関数:







 [UIApplication sharedApplication].statusBarFrame.size.height
      
      





Objective-CコードをDeviceInfoクラスで機能させるには、ソース解像度を.cppから.mmに変更する必要があります。 したがって、.proファイルで、次のことを実行します。







 HEADERS += \ Include/DeviceInfo.h !ios { SOURCES += \ Source/DeviceInfo.cpp } ios { OBJECTIVE_SOURCES += \ Source/DeviceInfo.mm }
      
      





DeviceInfo.mm:







 #include "DeviceInfo.h" #import <UIKit/UIKit.h> DeviceInfo::DeviceInfo(QObject *parent) : QObject(parent) { [[UIApplication sharedApplication] setStatusBarStyle:UIStatusBarStyleLightContent]; } DeviceInfo &DeviceInfo::instance(QObject *parent) { static DeviceInfo instance(parent); return instance; } int DeviceInfo::statusBarHeight() { return [UIApplication sharedApplication].statusBarFrame.size.height; }
      
      





画面上の結果:







iosスクリーンショット







おわりに



記事の例に基づいて、モバイルプロジェクトをネイティブコードで簡単に補完できるように、すべてのステップを可能な限り詳細にカバーしようとしました。 GitHubのサンプルのソースコードを見てください。








All Articles