3

This error occurs in some users.Below is a bug that users experience.

aused by android.view.InflateException: Binary XML file line #13: Error inflating class com.maccabi.ewavemobile.maccabihealthservices.utils.VideoEnabledWebView
   at android.view.LayoutInflater.createView + 645(LayoutInflater.java:645)
   at uk.co.chrisjenx.calligraphy.CalligraphyLayoutInflater.createCustomViewInternal + 211(CalligraphyLayoutInflater.java:211)
   at uk.co.chrisjenx.calligraphy.CalligraphyLayoutInflater.access$000 + 20(CalligraphyLayoutInflater.java:20)
   at uk.co.chrisjenx.calligraphy.CalligraphyLayoutInflater$PrivateWrapperFactory2.onCreateView + 302(CalligraphyLayoutInflater.java:302)
   at android.view.LayoutInflater$FactoryMerger.onCreateView + 186(LayoutInflater.java:186)
   at android.view.LayoutInflater.createViewFromTag + 754(LayoutInflater.java:754)
   at android.view.LayoutInflater.createViewFromTag + 704(LayoutInflater.java:704)
   at android.view.LayoutInflater.rInflate + 835(LayoutInflater.java:835)
   at android.view.LayoutInflater.rInflateChildren + 798(LayoutInflater.java:798)
   at android.view.LayoutInflater.rInflate + 838(LayoutInflater.java:838)
   at android.view.LayoutInflater.rInflateChildren + 798(LayoutInflater.java:798)
   at android.view.LayoutInflater.inflate + 515(LayoutInflater.java:515)
   at uk.co.chrisjenx.calligraphy.CalligraphyLayoutInflater.inflate + 60(CalligraphyLayoutInflater.java:60)
   at android.view.LayoutInflater.inflate + 423(LayoutInflater.java:423)
   at com.maccabi.ewavemobile.maccabihealthservices.ui.fragments.EWBaseFragment.onCreateView + 30(EWBaseFragment.java:30)
   at android.support.v4.app.Fragment.performCreateView + 2346(Fragment.java:2346)
   at android.support.v4.app.FragmentManagerImpl.moveToState + 1428(FragmentManager.java:1428)
   at android.support.v4.app.FragmentManagerImpl.moveFragmentToExpectedState + 1759(FragmentManager.java:1759)
   at android.support.v4.app.FragmentManagerImpl.moveToState + 1827(FragmentManager.java:1827)
   at android.support.v4.app.BackStackRecord.executeOps + 797(BackStackRecord.java:797)
   at android.support.v4.app.FragmentManagerImpl.executeOps + 2596(FragmentManager.java:2596)
   at android.support.v4.app.FragmentManagerImpl.executeOpsTogether + 2383(FragmentManager.java:2383)
   at android.support.v4.app.FragmentManagerImpl.removeRedundantOperationsAndExecute + 2338(FragmentManager.java:2338)
   at android.support.v4.app.FragmentManagerImpl.execPendingActions + 2245(FragmentManager.java:2245)
   at android.support.v4.app.FragmentManagerImpl$1.run + 703(FragmentManager.java:703)
   at android.os.Handler.handleCallback + 739(Handler.java:739)
   at android.os.Handler.dispatchMessage + 95(Handler.java:95)
   at android.os.Looper.loop + 148(Looper.java:148)
   at android.app.ActivityThread.main + 5525(ActivityThread.java:5525)
   at java.lang.reflect.Method.invoke(Method.java)
   at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run + 730(ZygoteInit.java:730)
   at com.android.internal.os.ZygoteInit.main + 620(ZygoteInit.java:620)

My xml

    <com.maccabi.ewavemobile.maccabihealthservices.utils.VideoEnabledWebView
        android:id="@+id/webView"
        android:layout_width="match_parent"
        android:layout_height="match_parent"/>

I created a custom VideoEnabledWebView class where it is inherited from the WebView class.Which I later use instead of WebView.

public class VideoEnabledWebView extends WebView {
public class JavascriptInterface {
    @android.webkit.JavascriptInterface
    @SuppressWarnings("unused")
    public void notifyVideoEnd() // Must match Javascript interface method of VideoEnabledWebChromeClient
    {
        // This code is not executed in the UI thread, so we must force that to happen
        new Handler(Looper.getMainLooper()).post(() -> {
            if (videoEnabledWebChromeClient != null) {
                videoEnabledWebChromeClient.onHideCustomView();
            }
        });
    }
}

private VideoEnabledWebChromeClient videoEnabledWebChromeClient;
private boolean addedJavascriptInterface;

@SuppressWarnings("unused")
public VideoEnabledWebView(Context context) {
    super(context);
    addedJavascriptInterface = false;
}

@SuppressWarnings("unused")
public VideoEnabledWebView(Context context, AttributeSet attrs) {
    super(context, attrs);
    addedJavascriptInterface = false;
}

@SuppressWarnings("unused")
public VideoEnabledWebView(Context context, AttributeSet attrs, int defStyle) {
    super(context, attrs, defStyle);
    addedJavascriptInterface = false;
}

/**
 * Indicates if the video is being displayed using a custom view (typically full-screen)
 *
 * @return true it the video is being displayed using a custom view (typically full-screen)
 */
@SuppressWarnings("unused")
public boolean isVideoFullscreen() {
    return videoEnabledWebChromeClient != null && videoEnabledWebChromeClient.isVideoFullscreen();
}

/**
 * Pass only a VideoEnabledWebChromeClient instance.
 */
@Override
@SuppressLint("SetJavaScriptEnabled")
public void setWebChromeClient(WebChromeClient client) {
    getSettings().setJavaScriptEnabled(true);

    if (client instanceof VideoEnabledWebChromeClient) {
        this.videoEnabledWebChromeClient = (VideoEnabledWebChromeClient) client;
    }

    super.setWebChromeClient(client);
}

@Override
public void loadData(String data, String mimeType, String encoding) {
    addJavascriptInterface();
    super.loadData(data, mimeType, encoding);
}

@Override
public void loadDataWithBaseURL(String baseUrl, String data, String mimeType, String encoding, String historyUrl) {
    addJavascriptInterface();
    super.loadDataWithBaseURL(baseUrl, data, mimeType, encoding, historyUrl);
}

@Override
public void loadUrl(String url) {
    addJavascriptInterface();
    super.loadUrl(url);
}

@Override
public void loadUrl(String url, Map<String, String> additionalHttpHeaders) {
    addJavascriptInterface();
    super.loadUrl(url, additionalHttpHeaders);
}

private void addJavascriptInterface() {
    if (!addedJavascriptInterface) {
        // Add javascript interface to be called when the video ends (must be done before page load)
        //noinspection all
        addJavascriptInterface(new JavascriptInterface(), "_VideoEnabledWebView"); // Must match Javascript interface name of VideoEnabledWebChromeClient

        addedJavascriptInterface = true;
    }
 }
}

and photo of fabric

this error is described in fabric

. I cannot understand where in the class an error occurs and why.

I would appreciate any help.

my EWBaseFragment

public abstract class EWBaseFragment extends Fragment {
private View mRootView;
private int mContentViewResourceId;
private DialogLoading mDialogLoading;

@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
    if (mRootView == null) {
        mRootView = (inflater == null ? getActivity().getLayoutInflater() : inflater).inflate(mContentViewResourceId, container, false);
    }

    return mRootView;
}

public void setContentView(int iContentViewResourceId) {
    mContentViewResourceId = iContentViewResourceId;
}

protected boolean isActivityIsOfTypeEwBaseActivity() {
    return getActivity() != null && getActivity() instanceof EWBaseActivity;
}

public EWService getService() {
    EWService result = null;

    if (isActivityIsOfTypeEwBaseActivity()) {
        result = ((EWBaseActivity) getActivity()).getService();
    }

    return result;
}

public boolean isServiceConnected() {
    boolean result = false;

    if (isActivityIsOfTypeEwBaseActivity()) {
        result = ((EWBaseActivity) getActivity()).isServiceConnected();
    }

    return result;
}

/**
 * Shows or hides a progress dialog, <B>IF the activity is of type {@link EWBaseActivity}</B>
 */
protected void trySetProgressDialog(boolean iShouldShow) {
    if (isActivityIsOfTypeEwBaseActivity()) {
        ((EWBaseActivity) getActivity()).setProgressDialog(iShouldShow);
    }
}

public abstract String setFragmentTitle();

public abstract String setHeaderColor();

public String getFragmentTitle() {
    String fragmentTitle = setFragmentTitle();

    return TextUtils.isEmpty(fragmentTitle) ? "" : fragmentTitle;
}

public String getHeaderColor() {
    String HEX = setHeaderColor();
    return TextUtils.isEmpty(HEX) ? AppUtils.tryParseColorToHEXOrDefault(R.color.color_toolbar_Blue) : HEX;
}

protected void showUI() {
    if (mDialogLoading != null) {
        mDialogLoading.dismiss();
    }
}

protected void blockUI() {
    if (mDialogLoading != null) {
        mDialogLoading.show();
    }
}

@Override
public void onDestroyView() {
    super.onDestroyView();
    if (mRootView != null) {
        ViewGroup parent = (ViewGroup) mRootView.getParent();
        if (parent != null) {
            parent.removeAllViews();
           }
        }
     }
 }
Kevin Kokomani
  • 1,568
  • 7
  • 14

0 Answers0