Я создал приложение для Android с 3 вкладками (фрагменты).
Я добавил межстраничные объявления на вкладке поиска. Это означает, что когда я нажимаю вкладку «Поиск», появляется всплывающая реклама. Но проблема в том, что межстраничная реклама загружается через 3 секунды. Это неправильно с политикой AdMob. Как это исправить? Я хочу, чтобы объявление загружалось без промедления при переходе на вкладку "Поиск".
Вот мой код:
MainActivity.java
public class MainActivity extends AppCompatActivity {
public InterstitialAd mInterstitialAd;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
BottomNavigationView bottomNav = findViewById(R.id.bottom_navigation);
getSupportFragmentManager().beginTransaction().replace(R.id.fragment_container,
new HomeFragment()).commit();
bottomNav.setOnNavigationItemSelectedListener(navListener);
}
private BottomNavigationView.OnNavigationItemSelectedListener navListener =
new BottomNavigationView.OnNavigationItemSelectedListener() {
@Override
public boolean onNavigationItemSelected(@NonNull MenuItem item) {
Fragment selectedFragment = null;
switch (item.getItemId()) {
case R.id.nav_home:
selectedFragment = new HomeFragment();
break;
case R.id.nav_favorites:
selectedFragment = new FavoritesFragment();
break;
case R.id.nav_search:
selectedFragment = new SearchFragment();
break;
} getSupportFragmentManager().beginTransaction().replace(R.id.fragment_container,
selectedFragment).commit();
return true;
}
};
//display code
private void displayInterstitial() {
mInterstitialAd.setAdListener(new AdListener() {
public void onAdLoaded() {
if (mInterstitialAd.isLoaded()) {
mInterstitialAd.show();
}
}
});
}
// display code end
}
SearchFragment.java
public class SearchFragment extends Fragment {
public InterstitialAd mInterstitialAd;
public static ViewPager viewPager;
@Nullable
@Override
public View onCreateView(LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {
View v = inflater.inflate(R.layout.fragment_search, container, false);
//fragment Interstitial ad code start
final AdRequest adRequest = new AdRequest.Builder().build();
mInterstitialAd = new InterstitialAd(getActivity());
mInterstitialAd.setAdUnitId("ca-app-pub-3940256099942544/1033173712");
mInterstitialAd.loadAd(adRequest);
mInterstitialAd.setAdListener(new AdListener() {
@Override
public void onAdLoaded() {
super.onAdLoaded();
if (mInterstitialAd.isLoaded()){
mInterstitialAd.show();
}
}
@Override
public void onAdClosed() {
}
});
//fragment Interstitial ad code end
return v;
}
}
Почти невозможно загрузить InterstitialAd без какой-либо задержки по таким причинам, как скорость сети, возможность подключения к сети, серверы Admob и т. д.
Вот почему InterstitialAds сначала загружаются, а затем показываются, когда вы хотите, чтобы они отображались.
В настоящее время вы загружаете InterstitialAd в методе onCreateView() вашего SearchFragment, а затем показываете его сразу после загрузки. На самом деле это неправильный подход.
Вместо этого вам следует загрузить рекламу намного раньше, например, в методе onCreate() вашей MainActivity. Затем в случае переключения для SearchFragment проверьте, загружено ли InterstitialAd. Если это так, покажите это.
Вот что я имею в виду:
public class MainActivity extends AppCompatActivity {
public InterstitialAd mInterstitialAd;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
loadInterstitial();
BottomNavigationView bottomNav = findViewById(R.id.bottom_navigation);
getSupportFragmentManager().beginTransaction().replace(R.id.fragment_container,
new HomeFragment()).commit();
bottomNav.setOnNavigationItemSelectedListener(navListener);
}
private BottomNavigationView.OnNavigationItemSelectedListener navListener = new BottomNavigationView.OnNavigationItemSelectedListener() {
@Override
public boolean onNavigationItemSelected(@NonNull MenuItem item) {
Fragment selectedFragment = null;
switch (item.getItemId()) {
case R.id.nav_home:
selectedFragment = new HomeFragment();
break;
case R.id.nav_favorites:
selectedFragment = new FavoritesFragment();
break;
case R.id.nav_search:
selectedFragment = new SearchFragment();
displayInterstitial();
break;
}
getSupportFragmentManager().beginTransaction().replace(R.id.fragment_container,
selectedFragment).commit();
return true;
}
};
private void loadInterstitial(){
mInterstitialAd = new InterstitialAd(this);
mInterstitialAd.setAdUnitId("ADMOB_INTERSTITIAL_ID");
mInterstitialAd.loadAd(new AdRequest.Builder().build());
mInterstitialAd.setAdListener(new AdListener() {
@Override
public void onAdClosed() {
mInterstitialAd.loadAd(new AdRequest.Builder().build());
}
});
}
private void displayInterstitial() {
if (mInterstitialAd.isLoaded()) {
mInterstitialAd.show();
}
}
Вам также следует загрузить следующее InterstitialAd, когда объявление будет закрыто, чтобы оно было готово к следующему нажатию SearchFragment.
Кроме того, не вставляйте свой идентификатор Admob Unit в код, который вы здесь показываете. Это не та информация, которой вам следует делиться.
Спасибо, работает. * getactivity отображается красным цветом в private void loadInterstitial (). Поэтому я изменил getactivity на это. Тогда все в порядке. Q: Время задержки уменьшено, но перед показом рекламы я вижу фрагмент поиска. Почему?
@ Mr.Soft Извините за эту ошибку, я скопировал и вставил код из вашего фрагмента и забыл отредактировать эту часть. Что касается вашего вопроса, SearchFragment все еще может появиться, потому что код для замены фрагмента все еще выполняется. Загрузка межстраничного объявления и показ фрагмента выполняются одновременно, поэтому SearchFragment может отображаться первым до того, как появится объявление. Если вы не хотите, чтобы SearchFragment отображался, вы можете изменить код, чтобы он загружал SearchFragment, если InterstitialAd еще не загружен, или после AdClosed, onAdFailedToLoad и onAdLeftApplication ().
Спасибо, работает. getactivity отображается красным цветом в private void loadInterstitial (). Поэтому я изменил getactivity на это. Тогда все в порядке.