Use QtQuickView with strong typing in qml_in_java_based_android_project

Changes in the way QtQuickView is used in MainActivity.java

Task-number: QTBUG-125098
Change-Id: I4b60bde84df17b8d765bf6a974e4b13cb38f5bc2
Reviewed-by: Assam Boudjelthia <assam.boudjelthia@qt.io>
Reviewed-by: Rami Potinkara <rami.potinkara@qt.io>
This commit is contained in:
Konsta Alajärvi 2024-05-10 10:34:16 +03:00
parent 8ff9a21709
commit f16e05ade6
1 changed files with 52 additions and 51 deletions

View File

@ -12,33 +12,33 @@ import android.util.DisplayMetrics;
import android.util.Log; import android.util.Log;
import android.view.View; import android.view.View;
import android.view.ViewGroup; import android.view.ViewGroup;
import android.widget.Button;
import android.widget.FrameLayout; import android.widget.FrameLayout;
import android.widget.LinearLayout; import android.widget.LinearLayout;
import android.widget.TextView; import android.widget.TextView;
import org.qtproject.qt.android.QtQmlStatus;
import org.qtproject.qt.android.QtQmlStatusChangeListener;
import org.qtproject.qt.android.QtQuickView; import org.qtproject.qt.android.QtQuickView;
import org.qtproject.example.qml_in_android_view.QmlModule.Main;
import java.util.HashMap; import java.util.HashMap;
import java.util.Map; import java.util.Map;
// Implement QtQuickView StatusChangeListener interface to get status updates // Implement QtQuickView StatusChangeListener interface to get status updates
// from the underlying QQuickView // from the underlying QQuickView
public class MainActivity extends AppCompatActivity implements QtQuickView.StatusChangeListener { public class MainActivity extends AppCompatActivity implements QtQmlStatusChangeListener {
private static final String TAG = "myTag"; private static final String TAG = "myTag";
private final Colors m_colors = new Colors(); private final Colors m_colors = new Colors();
private final Map<Integer, String> m_statusNames = new HashMap<Integer, String>() {{ private final Map<QtQmlStatus, String> m_statusNames = new HashMap<QtQmlStatus, String>() {{
put(QtQuickView.STATUS_READY, " READY"); put(QtQmlStatus.READY, " READY");
put(QtQuickView.STATUS_LOADING, " LOADING"); put(QtQmlStatus.LOADING, " LOADING");
put(QtQuickView.STATUS_ERROR, " ERROR"); put(QtQmlStatus.ERROR, " ERROR");
put(QtQuickView.STATUS_NULL, " NULL"); put(QtQmlStatus.NULL, " NULL");
}}; }};
private int m_qmlButtonSignalListenerId; private int m_qmlButtonSignalListenerId;
private LinearLayout m_mainLinear; private LinearLayout m_mainLinear;
private FrameLayout m_qmlFrameLayout; private FrameLayout m_qmlFrameLayout;
private QtQuickView m_qmlView; private QtQuickView m_qtQuickView;
private Main m_mainQmlComponent;
private LinearLayout m_androidControlsLayout; private LinearLayout m_androidControlsLayout;
private TextView m_getPropertyValueText; private TextView m_getPropertyValueText;
private TextView m_qmlStatus; private TextView m_qmlStatus;
@ -56,31 +56,32 @@ public class MainActivity extends AppCompatActivity implements QtQuickView.Statu
m_qmlStatus = findViewById(R.id.qmlStatus); m_qmlStatus = findViewById(R.id.qmlStatus);
m_androidControlsLayout = findViewById(R.id.javaLinear); m_androidControlsLayout = findViewById(R.id.javaLinear);
m_box = findViewById(R.id.box); m_box = findViewById(R.id.box);
m_switch = findViewById(R.id.switch1); m_switch = findViewById(R.id.switch1);
m_switch.setOnClickListener(view -> switchListener()); m_switch.setOnClickListener(view -> switchListener());
m_mainQmlComponent = new Main();
//! [m_qmlView] //! [m_qmlView]
m_qmlView = new QtQuickView(this, "qrc:/qt/qml/qml_in_android_view/main.qml", m_qtQuickView = new QtQuickView(this);
"qml_in_android_view");
//! [m_qmlView] //! [m_qmlView]
// Set status change listener for m_qmlView // Set status change listener for m_qmlView
// listener implemented below in OnStatusChanged // listener implemented below in OnStatusChanged
//! [setStatusChangeListener] //! [setStatusChangeListener]
m_qmlView.setStatusChangeListener(this); m_mainQmlComponent.setStatusChangeListener(this);
//! [setStatusChangeListener] //! [setStatusChangeListener]
//! [layoutParams] //! [layoutParams]
ViewGroup.LayoutParams params = new FrameLayout.LayoutParams( ViewGroup.LayoutParams params = new FrameLayout.LayoutParams(
ViewGroup.LayoutParams.MATCH_PARENT, ViewGroup.LayoutParams.MATCH_PARENT); ViewGroup.LayoutParams.MATCH_PARENT, ViewGroup.LayoutParams.MATCH_PARENT);
m_qmlFrameLayout = findViewById(R.id.qmlFrame); m_qmlFrameLayout = findViewById(R.id.qmlFrame);
m_qmlFrameLayout.addView(m_qmlView, params); m_qmlFrameLayout.addView(m_qtQuickView, params);
//! [layoutParams] //! [layoutParams]
Button button = findViewById(R.id.button); m_qtQuickView.loadComponent(m_mainQmlComponent);
button.setOnClickListener(view -> onClickListener());
findViewById(R.id.button).setOnClickListener(view -> onClickListener());
// Check target device orientation on launch // Check target device orientation on launch
handleOrientationChanges(); handleOrientationChanges();
} }
//! [onCreate] //! [onCreate]
@Override @Override
public void onConfigurationChanged(@NonNull Configuration newConfig) { public void onConfigurationChanged(@NonNull Configuration newConfig) {
@ -113,38 +114,13 @@ public class MainActivity extends AppCompatActivity implements QtQuickView.Statu
m_androidControlsLayout.setLayoutParams(linearLayoutParams); m_androidControlsLayout.setLayoutParams(linearLayoutParams);
} }
//! [onStatusChanged]
@Override
public void onStatusChanged(int status) {
Log.i(TAG, "Status of QtQuickView: " + status);
final String qmlStatus = getResources().getString(R.string.qml_view_status)
+ m_statusNames.get(status);
// Show current QML View status in a textview
m_qmlStatus.setText(qmlStatus);
// Connect signal listener to "onClicked" signal from main.qml
// addSignalListener returns int which can be used later to identify the listener
//! [qml signal listener]
if (status == QtQuickView.STATUS_READY && !m_switch.isChecked()) {
m_qmlButtonSignalListenerId = m_qmlView.connectSignalListener("onClicked", Object.class,
(String signal, Object o) -> {
Log.i(TAG, "QML button clicked");
m_androidControlsLayout.setBackgroundColor(Color.parseColor(m_colors.getColor()));
});
}
//! [qml signal listener]
}
//! [onStatusChanged]
//! [onClickListener] //! [onClickListener]
public void onClickListener() { public void onClickListener() {
// Set the QML view root object property "colorStringFormat" value to // Set the QML view root object property "colorStringFormat" value to
// color from Colors.getColor() // color from Colors.getColor()
m_qmlView.setProperty("colorStringFormat", m_colors.getColor()); m_mainQmlComponent.setColorStringFormat(m_colors.getColor());
String qmlBackgroundColor = m_qmlView.getProperty("colorStringFormat"); String qmlBackgroundColor = m_mainQmlComponent.getColorStringFormat();
// Display the QML View background color code // Display the QML View background color code
m_getPropertyValueText.setText(qmlBackgroundColor); m_getPropertyValueText.setText(qmlBackgroundColor);
@ -162,17 +138,42 @@ public class MainActivity extends AppCompatActivity implements QtQuickView.Statu
Log.i(TAG, "QML button onClicked signal listener disconnected"); Log.i(TAG, "QML button onClicked signal listener disconnected");
text.setText(R.string.connect_qml_button_signal_listener); text.setText(R.string.connect_qml_button_signal_listener);
//! [disconnect qml signal listener] //! [disconnect qml signal listener]
m_qmlView.disconnectSignalListener(m_qmlButtonSignalListenerId); m_mainQmlComponent.disconnectSignalListener(m_qmlButtonSignalListenerId);
//! [disconnect qml signal listener] //! [disconnect qml signal listener]
} else { } else {
Log.i(TAG, "QML button onClicked signal listener connected"); Log.i(TAG, "QML button onClicked signal listener connected");
text.setText(R.string.disconnect_qml_button_signal_listener); text.setText(R.string.disconnect_qml_button_signal_listener);
m_qmlButtonSignalListenerId = m_qmlView.connectSignalListener("onClicked", m_qmlButtonSignalListenerId = m_mainQmlComponent.connectOnClickedListener(
Object.class, (String t, Object value) -> { (String name, Void v) -> {
Log.i(TAG, "QML button clicked"); Log.i(TAG, "QML button clicked");
m_androidControlsLayout.setBackgroundColor(Color.parseColor(m_colors.getColor())); m_androidControlsLayout.setBackgroundColor(Color.parseColor(m_colors.getColor()));
}); });
} }
} }
//! [onStatusChanged]
@Override
public void onStatusChanged(QtQmlStatus qtQmlStatus) {
Log.i(TAG, "Status of QtQuickView: " + qtQmlStatus);
final String qmlStatus = getResources().getString(R.string.qml_view_status)
+ m_statusNames.get(qtQmlStatus);
// Show current QML View status in a textview
m_qmlStatus.setText(qmlStatus);
// Connect signal listener to "onClicked" signal from main.qml
// addSignalListener returns int which can be used later to identify the listener
//! [qml signal listener]
if (qtQmlStatus == QtQmlStatus.READY && !m_switch.isChecked()) {
m_qmlButtonSignalListenerId = m_mainQmlComponent.connectOnClickedListener(
(String name, Void v) -> {
Log.i(TAG, "QML button clicked");
m_androidControlsLayout.setBackgroundColor(Color.parseColor(m_colors.getColor()));
});
}
//! [qml signal listener]
}
//! [onStatusChanged]
} }