【问题标题】:How to stop delay showing Interstitial ads in Tabs?如何停止在标签中延迟显示插页式广告?
【发布时间】:2018-07-14 07:31:20
【问题描述】:

我创建了一个带有 3 个标签(片段)的 android 应用。

我在“搜索”标签中添加了插页式广告。这意味着当我单击“搜索”选项卡时,会弹出插页式广告。但问题是 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;
    }
}

【问题讨论】:

    标签: android android-fragments admob interstitial


    【解决方案1】:

    由于网络速度、网络连接、Admob 的服务器等原因,几乎不可能毫无延迟地加载 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 粘贴到您在此处显示的代码中。这不是你应该分享的信息。

    【讨论】:

    • 谢谢。它正在工作。 getactivity 在 private void loadInterstitial() 中以红色显示。所以我将 getactivity 更改为 this。然后就可以了。
    • 谢谢。它正在工作。 *getactivity 在 private void loadInterstitial() 中以红色显示。所以我将 getactivity 更改为 this。然后就可以了。问:延迟时间减少了。但是在出现广告之前我可以看到搜索片段。这是为什么?
    • @Mr.Soft 很抱歉这个错误,我从你的片段中复制并粘贴了代码,忘记编辑那部分。至于您的问题, SearchFragment 仍然可以出现,因为替换片段的代码仍在执行。加载插页式广告和显示片段同时运行,因此 SearchFragment 可以在广告出现之前先显示。如果您不希望 SearchFragment 显示,您可以更改代码,以便在 InterstitialAd 尚未加载或 AdClosed、onAdFailedToLoad 和 onAdLeftApplication() 加载时加载 SearchFragment。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多