Android solves the problem of flashing a black screen during SurfaceView switching in Fragment.
After restructuring a previous news client, Fragment is all used for page switching. There is only one portal Activity as the startup Activity of the program. One of the interfaces needs to call the camera to identify the QR code, as a result, SurfaceView will be used for preview. The problem arises. When you switch to the corresponding Fragment, the screen will be black and the normal interface will be displayed in about one second after it is black, in addition, this phenomenon only occurs when you enter the Fragment for the first time, and will not appear after you enter the Fragment. The solution is that you did not see it on github. After trying it, you can do it, the solution is as follows.
Method 1: Add the following code in onCreate of Activity
getWindow().setFormat(PixelFormat.TRANSLUCENT);
However, if you do this in fragment, it seems that it will not work.
Method 2: add an element with a length and width of 0 Px to the root view of the activity and the SurfaceView element is invisible.
Cause:
SurfaceView is different from a general view. It has its own buffer and data access mechanism, and the system has special processing for it. When surfaceview is added to the current activity for the first time, the system will re-arrange the layout and relayout for WindowManager. This will make it black and appear only for the first time, when surfaceview is added later, the screen will not be black.
In my own project, because all the pages are switched using fragment, only one activity is declared in the list file, but the code can configure whether the newly opened activity is used as the fragment container, because I don't want to add code to this activity any moreGetWindow (). setFormat (PixelFormat. TRANSLUCENT );So I used the newly opened activity as the fragment container, and the problem was also solved.
The code with a pop-up screen is like this.
private static final int REQUEST_CODE_SCAN = 1;openPageForResult(scan,null,CoreAnim.slide,REQUEST_CODE_SCAN);
However, this function has an overload function that determines whether to create a new activity. Here we use the overload function to solve this problem.
private static final int REQUEST_CODE_SCAN = 1;openPageForResult(true,scan,null,CoreAnim.slide,REQUEST_CODE_SCAN);
Function prototype
/*** Open the fragment and request the returned value, and set whether to open * @ param newActivity * @ param pageName Page name * @ param bundle parameter * @ param coreAnim animation * @ param requestCode Request Code * @ return fragment object */public final Fragment openPageForResult (boolean newActivity, string pageName, Bundle bundle, CoreAnim coreAnim, int requestCode );