I know there are a few questions regarding the same but none of it answers my issue.
I’ve a CustomTextureView as follows:
public class CustomTextureView extends TextureView
{
public CustomTextureView( Context context )
{
super( context );
Log.e( "droidtag", "CustomTextureView created");
}
public void setListener()
{
setSurfaceTextureListener( new CustomTextureViewListener() );
}
private class CustomTextureViewListener implements SurfaceTextureListener
{
@Override
public void onSurfaceTextureAvailable(final SurfaceTexture surfaceTexture, final int width, final int height)
{
Log.e( "droidtag", "CustomTextureView onSurfaceTextureAvailable");
}
@Override
public void onSurfaceTextureSizeChanged(SurfaceTexture surfaceTexture, int width, int height)
{
Log.e( "droidtag", "CustomTextureView onSurfaceTextureSizeChanged");
}
@Override
public boolean onSurfaceTextureDestroyed(SurfaceTexture surfaceTexture)
{
Log.e( "droidtag", "CustomTextureView onSurfaceTextureDestroyed");
return true;
}
@Override
public void onSurfaceTextureUpdated(SurfaceTexture surfaceTexture)
{
Log.e( "droidtag", "CustomTextureView onSurfaceTextureUpdated");
}
}
@Override
protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
super.onMeasure(widthMeasureSpec, heightMeasureSpec);
int width = MeasureSpec.getSize(widthMeasureSpec);
int height = MeasureSpec.getSize(heightMeasureSpec);
Log.e("droidtag", "CustomTextureView::onMeasure() called with width = " + width + " and height = " + height);
setMeasuredDimension(width, height);
}
}
Now I’ve a ViewHeirarcy with custom classes as follows:
ViewRoot -> RelativeLayout -> LinearLayout
I create the CustomTextureView
in the constructor of my custom class which extends LinearLayout
.
I get the onSurfaceTextureAvailable
callback for this. But, after doing stuff in native side I call a function:
public void resetTextureView()
{
if( mCustomTextureView != null )
{
if( mCustomTextureView.getParent() != null )
{
( ( ViewGroup )mCustomTextureView.getParent() ).removeView( mCustomTextureView );
}
mCustomTextureView = null;
}
mCustomTextureView = new CustomTextureView( getContext() );
this.addView( mCustomTextureView );
LayoutParams params = LayoutParams mCustomTextureView.getLayoutParams();
params.height = 200;
params.width = 200;
mCustomTextureView.setLayoutParams(params);
mCustomTextureView.setListener();
this.invalidate();
}
This never calls onSurfaceTextureAvailable
, however I when I change it to its parent i.e
this.addView( mCustomTextureView )
to this.getParent().addView( mCustomTextureView )
I get the callback as expected.
Some of the already existing solutions does not seem to be the issue:
- The app is hardware accelerated
- All of them are
VISIBLE
(fromgetVisibility
) and have non zero height and width. - dispatchDraw on the
LinearLayout
gets called as intended andCustomTextureView.onMeasure
is also called – in all the cases.
Also, I can actually see the newly created CustomTextureView
on screen – the gray part:
Any pointers or suggestions as to why I’m not getting the onSurfaceTextureAvailable
callback will be helpful. Please do ask for additional information if necessary.
Thanks