Handle native views visibility properly.

Hide the native view in constructor and in destructor.

Task-number: QTBUG-40159
Change-Id: I200b28af9ac2928c38299b71395a97e39f1bbe6d
Reviewed-by: Christian Stromme <christian.stromme@theqtcompany.com>
This commit is contained in:
BogDan Vatra 2015-12-04 15:36:40 +02:00
parent 397061a6a9
commit fd639b7adc
4 changed files with 26 additions and 1 deletions

View File

@ -214,6 +214,16 @@ public class QtNative
});
}
private static void setViewVisibility(final View view, final boolean visible)
{
runAction(new Runnable() {
@Override
public void run() {
view.setVisibility(visible ? View.VISIBLE : View.GONE);
}
});
}
public static boolean startApplication(String params,
String environment,
String mainLibrary,

View File

@ -356,6 +356,15 @@ namespace QtAndroid
return surfaceId;
}
void setViewVisibility(jobject view, bool visible)
{
QJNIObjectPrivate::callStaticMethod<void>(m_applicationClass,
"setViewVisibility",
"(Landroid/view/View;Z)V",
view,
visible);
}
void setSurfaceGeometry(int surfaceId, const QRect &geometry)
{
if (surfaceId == -1)

View File

@ -62,6 +62,7 @@ namespace QtAndroid
int createSurface(AndroidSurfaceClient * client, const QRect &geometry, bool onTop, int imageDepth);
int insertNativeView(jobject view, const QRect &geometry);
void setViewVisibility(jobject view, bool visible);
void setSurfaceGeometry(int surfaceId, const QRect &geometry);
void destroySurface(int surfaceId);
void bringChildToFront(int surfaceId);

View File

@ -45,10 +45,14 @@ QAndroidPlatformForeignWindow::QAndroidPlatformForeignWindow(QWindow *window)
{
const WId wId = window->property("_q_foreignWinId").value<WId>();
m_view = reinterpret_cast<jobject>(wId);
if (m_view.isValid())
QtAndroid::setViewVisibility(m_view.object(), false);
}
QAndroidPlatformForeignWindow::~QAndroidPlatformForeignWindow()
{
if (m_view.isValid())
QtAndroid::setViewVisibility(m_view.object(), false);
if (m_surfaceId != -1)
QtAndroid::destroySurface(m_surfaceId);
}
@ -84,8 +88,9 @@ void QAndroidPlatformForeignWindow::setVisible(bool visible)
if (!m_view.isValid())
return;
QAndroidPlatformWindow::setVisible(visible);
QtAndroid::setViewVisibility(m_view.object(), visible);
QAndroidPlatformWindow::setVisible(visible);
if (!visible && m_surfaceId != -1) {
QtAndroid::destroySurface(m_surfaceId);
m_surfaceId = -1;