Я использовал this Руководство AdMob для добавления рекламного объявления в мое приложение. Приложение имеет MainActivity
с WebView
для обработки игры-головоломки, а также верхнюю панель и навигационный ящик для обработки навигации.Android WebView исчезает после закрытия межстраничного видеообъявления
Интерстициальные работы прекрасно подходят для текстовых и графических объявлений, но не для видеообъявлений. После закрытия видеообъявления WebView
исчез (верхняя панель и навигационный ящик все еще там). Если я после этого нажмите на пункт меню в панели навигации, которые должны ориентироваться на новую страницу в WebView
, приложение падает со следующим NullPointerException
(проверено на Android 4.2 и 6.0 устройства):
java.lang.NullPointerException: Attempt to invoke virtual method 'void android.webkit.WebView.loadUrl(java.lang.String)' on a null object reference
at com.bd.test.MainActivity.k(Unknown Source)
at com.bd.test.MainActivity.a(Unknown Source)
at android.support.design.widget.aa.a(Unknown Source)
at android.support.v7.view.menu.i.a(Unknown Source)
at android.support.v7.view.menu.m.b(Unknown Source)
at android.support.v7.view.menu.i.a(Unknown Source)
at android.support.design.internal.d.onClick(Unknown Source)
at android.view.View.performClick(View.java:5198)
at android.view.View$PerformClick.run(View.java:21147)
at android.os.Handler.handleCallback(Handler.java:742)
at android.os.Handler.dispatchMessage(Handler.java:97)
at android.os.Looper.loop(Looper.java:148)
at android.app.ActivityThread.main(ActivityThread.java:5457)
at java.lang.reflect.Method.invoke(Native Method)
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:726)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:616)
С помощью меню item click handler вызывает функцию loadUrl
моего WebView
объекта mWebView
, который как-то установлен на null
при показе или закрытии межстраничного видеообъявления.
Могут ли быть помехи между двумя WebView
; моя и та, которая показывает объявление межстраничного объявления (похожее на то, что раньше было observed).
Или я просто ошибаюсь в своем коде? Соответствующие части моего MainActivity
приведены ниже:
public class MainActivity extends AppCompatActivity
implements NavigationView.OnNavigationItemSelectedListener {
protected WebView mWebView;
protected InterstitialAd mInterstitialAd;
protected int pageId = R.id.nav_home;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
//initToolbar();
//initDrawer();
//initNavigationView();
initAdInterstitial();
if (savedInstanceState != null) {
return;
}
initWebView();
navigate();
}
@Override
public boolean onNavigationItemSelected(MenuItem item) {
pageId = item.getItemId();
navigate();
return true;
}
protected void navigate() {
// Close drawer if it is open.
if(mDrawer.isDrawerOpen(GravityCompat.START)) {
mDrawer.closeDrawer(GravityCompat.START);
}
if(pageId == R.id.nav_home) {
mWebView.loadUrl(URL_INDEX);
}
else if(pageId == R.id.nav_level0) {
mWebView.loadUrl(getLevelUrl(0));
}
else if(pageId == R.id.nav_level1) {
mWebView.loadUrl(getLevelUrl(1));
}
else if(pageId == R.id.nav_level2) {
mWebView.loadUrl(getLevelUrl(2));
}
else if(pageId == R.id.nav_level3) {
mWebView.loadUrl(getLevelUrl(3));
}
else if(pageId == R.id.nav_history) {
mWebView.loadUrl(URL_LAST_PLAYED);
}
}
protected void initWebView() {
mWebView = (WebView) findViewById(R.id.webview);
// Enable Javascript
WebSettings webSettings = mWebView.getSettings();
webSettings.setJavaScriptEnabled(true);
webSettings.setDomStorageEnabled(true);
webSettings.setDatabaseEnabled(true);
webSettings.setAllowUniversalAccessFromFileURLs(true);
webSettings.setDefaultTextEncodingName("utf-8");
// Deprecated.
if (Build.VERSION.SDK_INT < Build.VERSION_CODES.KITKAT) {
Context c = mWebView.getContext();
webSettings.setDatabasePath(c.getFilesDir().getPath() + c.getPackageName() +
"/databases/");
}
mWebView.setWebViewClient(new WebViewClient() {
/*
* HERE IS WHERE THE INTERSTITIAL AD IS SHOWN.
*
* Shows the interstitial ad every n-th page load.
*/
public void onPageFinished(WebView view, String url) {
// After WebView page is loaded:
// Update page load count.
navigationCount = (navigationCount + 1) % adFrequency;
// Show ad once every n-th page load.
if(navigationCount == 0) {
showAd();
}
}
});
}
protected void initAdInterstitial() {
mInterstitialAd = new InterstitialAd(this);
mInterstitialAd.setAdUnitId(getString(R.string.interstitial_ad_unit_id));
mInterstitialAd.setAdListener(new AdListener() {
@Override
public void onAdClosed() {
requestNewInterstitial();
}
});
requestNewInterstitial();
}
protected void requestNewInterstitial() {
AdRequest adRequest = new AdRequest.Builder().build();
mInterstitialAd.loadAd(adRequest);
}
public void showAd() {
if (mInterstitialAd.isLoaded()) {
mInterstitialAd.show();
}
}
}
Я знаю, я попытался получить обфускацию stacktrace, но у меня никогда не было рекламного объявления на моей де-запутанной отладочной версии (только текст и изображение, тогда он отлично работает). Поэтому в настоящее время у меня есть только стек из обфускационной версии. Но с объяснением, которое я надеялся, было ясно, что переменная mWebView имеет значение null, когда loadUrl вызывается в навигационной функции. –
И вы, скорее всего, правы в файле savedInstanceState (я забыл, что немного, вставил if-statement на основе некоторой документации по фрагментам, но забыл обновить его впоследствии). Я могу только проверить это позже сегодня или завтра, я отвечу на ответ позже. –
Вы действительно были правы. Потребовалось много времени, прежде чем появилось видеообъявление, но это, наконец, произошло, и это сработало! Спасибо, Уильям! –