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
. 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();
}
}
}
}