如何停止在选项卡中延迟显示插页式广告?
How to stop delay showing Interstitial ads in Tabs?
我创建了一个 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;
}
}
由于网络速度、网络连接、Admob 的服务器等原因,InterstitialAd 几乎不可能没有任何延迟地加载。
这就是为什么要先加载 InterstitialAd,然后在您希望它显示时显示的原因。
目前,您正在 SearchFragment 的 onCreateView()
方法中加载一个 InterstitialAd,然后在加载后立即显示它。这实际上是错误的做法。
相反,您应该更早地加载广告,例如在 MainActivity 的 onCreate()
方法中。然后,在 SearchFragment 的 switch case 中检查是否加载了 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 单元 ID 粘贴到您在此处显示的代码中。那不是您应该分享的信息。
我创建了一个 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;
}
}
由于网络速度、网络连接、Admob 的服务器等原因,InterstitialAd 几乎不可能没有任何延迟地加载。
这就是为什么要先加载 InterstitialAd,然后在您希望它显示时显示的原因。
目前,您正在 SearchFragment 的 onCreateView()
方法中加载一个 InterstitialAd,然后在加载后立即显示它。这实际上是错误的做法。
相反,您应该更早地加载广告,例如在 MainActivity 的 onCreate()
方法中。然后,在 SearchFragment 的 switch case 中检查是否加载了 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 单元 ID 粘贴到您在此处显示的代码中。那不是您应该分享的信息。