如何通过按导航栏中的第二个选项卡来显示插页式广告?
How can I display Interstitial ad by pressing on the second tab in my navigationbar?
在我的应用程序中,我有一个包含三个选项卡的导航栏,每个选项卡都是一个片段,该栏如下所示:https://gyazo.com/5052f885effb3e0154d407b3bd8d3884它只是一个包含三个选项卡的普通导航栏。
所以现在我想显示我的插页式广告(我在 MainActivity onCreate 中加载),方法是按第二个选项卡,在本例中是名为 "Ausraster".
的选项卡
所以我执行了以下操作:我在 MainActivity onCreate 中加载了插页式广告,如下所示:
public class MainActivity extends AppCompatActivity{
public InterstitialAd mInterstitialAd;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
AdRequest adRequest = new AdRequest.Builder().build();
mInterstitialAd = new InterstitialAd(MainActivity.this);
mInterstitialAd.setAdUnitId("MY ID");
mInterstitialAd.loadAd(adRequest);
}
然后我在我的 MainActivity 中写了 displayInterstitial 方法:
public void displayInterstitial() {
mInterstitialAd.setAdListener(new AdListener() {
public void onAdLoaded() {
if (mInterstitialAd.isLoaded()) {
mInterstitialAd.show();
}
}
});
}
最后我在第二个片段 "Ausraster" 片段的 onCreateView 中写下了这一行:
((MainActivity)getActivity()).displayInterstitial();
现在实际上应该折叠所有内容,但问题如下:如果我启动应用程序,插页式广告会在延迟 3 秒后显示,而无需按下第二个选项卡。但我希望它仅在我单击第二个选项卡时显示。那我该怎么办?
我遇到这个问题一个多月了,如果有人能告诉我为什么不按第二个标签就显示插页式广告,我会很高兴。
这是我所有的代码,希望你能给我解释一下,抱歉我的英语不好:)
主要活动:
public class MainActivity extends AppCompatActivity{
FragmentManager mFragmentManager;
FragmentTransaction mFragmentTransaction;
public InterstitialAd mInterstitialAd;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
/**
*Setup the NavigationView
*/
mNavigationView = (NavigationView) findViewById(R.id.shitstuff) ;
/**
* Lets inflate the very first fragment
* Here , we are inflating the TabFragment as the first Fragment
*/
mFragmentManager = getSupportFragmentManager();
mFragmentTransaction = mFragmentManager.beginTransaction();
mFragmentTransaction.replace(R.id.containerView,new TabFragment()).commit();
AdRequest adRequest = new AdRequest.Builder().build();
mInterstitialAd = new InterstitialAd(MainActivity.this);
mInterstitialAd.setAdUnitId("MyId");
mInterstitialAd.loadAd(adRequest);
}
public void displayInterstitial() {
mInterstitialAd.setAdListener(new AdListener() {
public void onAdLoaded() {
if (mInterstitialAd.isLoaded()) {
mInterstitialAd.show();
}
}
});
}
}
TabFragment:
public class TabFragment extends Fragment {
public static TabLayout tabLayout;
public static ViewPager viewPager;
public static int int_items = 3 ;
@Nullable
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
/**
*Inflate tab_layout and setup Views.
*/
View x = inflater.inflate(R.layout.tab_layout,null);
tabLayout = (TabLayout) x.findViewById(R.id.tabs);
viewPager = (ViewPager) x.findViewById(R.id.viewpager);
/**
*Set an Apater for the View Pager
*/
viewPager.setAdapter(new MyAdapter(getChildFragmentManager()));
/**
* Now , this is a workaround ,
* The setupWithViewPager dose't works without the runnable .
* Maybe a Support Library Bug .
*/
tabLayout.post(new Runnable() {
@Override
public void run() {
tabLayout.setupWithViewPager(viewPager);
}
});
return x;
}
class MyAdapter extends FragmentPagerAdapter {
public MyAdapter(FragmentManager fm) {
super(fm);
}
/**
* Return fragment with respect to Position .
*/
@Override
public Fragment getItem(int position)
{
if(position == 0){
return new KommentareFragment();
}
if(position == 1){
return new AusrasterFragment();
}
if(position == 2){
return new LustigesFragment();
}
return null;
}
@Override
public int getCount() {
return int_items;
}
/**
* This method returns the title of the tab according to the position.
*/
@Override
public CharSequence getPageTitle(int position) {
switch (position){
case 0 :
return "Kommentare";
case 1 :
return "Ausraster";
case 2 :
return "Lustiges";
}
return null;
}
}
final public void showInterstitial(){
mInterstitialAd.setAdListener(new AdListener() {
@Override
public void onAdLoaded() {
super.onAdLoaded();
if(mInterstitialAd.isLoaded()){
mInterstitialAd.show();
}
}
@Override
public void onAdClosed() {
}
});
}
}
最后是我的第二个片段:
public class AusrasterFragment extends Fragment{
@Nullable
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
View rootView=inflater.inflate(R.layout.ausraster_layout,container,false);
return rootView;
}
ViewPager
提前加载其他离屏片段,使切换标签时动画看起来流畅。
因此,无需点击第二个选项卡即可加载广告。但是,您可以使用 viewPager.setOffscreenPageLimit
更改要加载的屏幕外片段的数量,但其默认和最小值为 1。如果将其设置为 1,则会提前创建第二个选项卡,而不是第三个选项卡。
要在选择第二个标签时加载广告,您必须使用 ViewPager 的 pageChangeListener 并检查是否选择了第二个标签,显示广告。
viewPager.setOnPageChangeListener(new OnPageChangeListener() {
public void onPageScrollStateChanged(int state) {}
public void onPageScrolled(int position, float positionOffset, int positionOffsetPixels) {}
public void onPageSelected(int position) {
if(position == 1)
displayInterstitial();
}
});
并且不要忘记从片段中删除 ((MainActivity)getActivity()).displayInterstitial();
。
在我的应用程序中,我有一个包含三个选项卡的导航栏,每个选项卡都是一个片段,该栏如下所示:https://gyazo.com/5052f885effb3e0154d407b3bd8d3884它只是一个包含三个选项卡的普通导航栏。
所以现在我想显示我的插页式广告(我在 MainActivity onCreate 中加载),方法是按第二个选项卡,在本例中是名为 "Ausraster".
的选项卡所以我执行了以下操作:我在 MainActivity onCreate 中加载了插页式广告,如下所示:
public class MainActivity extends AppCompatActivity{
public InterstitialAd mInterstitialAd;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
AdRequest adRequest = new AdRequest.Builder().build();
mInterstitialAd = new InterstitialAd(MainActivity.this);
mInterstitialAd.setAdUnitId("MY ID");
mInterstitialAd.loadAd(adRequest);
}
然后我在我的 MainActivity 中写了 displayInterstitial 方法:
public void displayInterstitial() {
mInterstitialAd.setAdListener(new AdListener() {
public void onAdLoaded() {
if (mInterstitialAd.isLoaded()) {
mInterstitialAd.show();
}
}
});
}
最后我在第二个片段 "Ausraster" 片段的 onCreateView 中写下了这一行:
((MainActivity)getActivity()).displayInterstitial();
现在实际上应该折叠所有内容,但问题如下:如果我启动应用程序,插页式广告会在延迟 3 秒后显示,而无需按下第二个选项卡。但我希望它仅在我单击第二个选项卡时显示。那我该怎么办?
我遇到这个问题一个多月了,如果有人能告诉我为什么不按第二个标签就显示插页式广告,我会很高兴。
这是我所有的代码,希望你能给我解释一下,抱歉我的英语不好:)
主要活动:
public class MainActivity extends AppCompatActivity{
FragmentManager mFragmentManager;
FragmentTransaction mFragmentTransaction;
public InterstitialAd mInterstitialAd;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
/**
*Setup the NavigationView
*/
mNavigationView = (NavigationView) findViewById(R.id.shitstuff) ;
/**
* Lets inflate the very first fragment
* Here , we are inflating the TabFragment as the first Fragment
*/
mFragmentManager = getSupportFragmentManager();
mFragmentTransaction = mFragmentManager.beginTransaction();
mFragmentTransaction.replace(R.id.containerView,new TabFragment()).commit();
AdRequest adRequest = new AdRequest.Builder().build();
mInterstitialAd = new InterstitialAd(MainActivity.this);
mInterstitialAd.setAdUnitId("MyId");
mInterstitialAd.loadAd(adRequest);
}
public void displayInterstitial() {
mInterstitialAd.setAdListener(new AdListener() {
public void onAdLoaded() {
if (mInterstitialAd.isLoaded()) {
mInterstitialAd.show();
}
}
});
}
}
TabFragment:
public class TabFragment extends Fragment {
public static TabLayout tabLayout;
public static ViewPager viewPager;
public static int int_items = 3 ;
@Nullable
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
/**
*Inflate tab_layout and setup Views.
*/
View x = inflater.inflate(R.layout.tab_layout,null);
tabLayout = (TabLayout) x.findViewById(R.id.tabs);
viewPager = (ViewPager) x.findViewById(R.id.viewpager);
/**
*Set an Apater for the View Pager
*/
viewPager.setAdapter(new MyAdapter(getChildFragmentManager()));
/**
* Now , this is a workaround ,
* The setupWithViewPager dose't works without the runnable .
* Maybe a Support Library Bug .
*/
tabLayout.post(new Runnable() {
@Override
public void run() {
tabLayout.setupWithViewPager(viewPager);
}
});
return x;
}
class MyAdapter extends FragmentPagerAdapter {
public MyAdapter(FragmentManager fm) {
super(fm);
}
/**
* Return fragment with respect to Position .
*/
@Override
public Fragment getItem(int position)
{
if(position == 0){
return new KommentareFragment();
}
if(position == 1){
return new AusrasterFragment();
}
if(position == 2){
return new LustigesFragment();
}
return null;
}
@Override
public int getCount() {
return int_items;
}
/**
* This method returns the title of the tab according to the position.
*/
@Override
public CharSequence getPageTitle(int position) {
switch (position){
case 0 :
return "Kommentare";
case 1 :
return "Ausraster";
case 2 :
return "Lustiges";
}
return null;
}
}
final public void showInterstitial(){
mInterstitialAd.setAdListener(new AdListener() {
@Override
public void onAdLoaded() {
super.onAdLoaded();
if(mInterstitialAd.isLoaded()){
mInterstitialAd.show();
}
}
@Override
public void onAdClosed() {
}
});
}
}
最后是我的第二个片段:
public class AusrasterFragment extends Fragment{
@Nullable
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
View rootView=inflater.inflate(R.layout.ausraster_layout,container,false);
return rootView;
}
ViewPager
提前加载其他离屏片段,使切换标签时动画看起来流畅。
因此,无需点击第二个选项卡即可加载广告。但是,您可以使用 viewPager.setOffscreenPageLimit
更改要加载的屏幕外片段的数量,但其默认和最小值为 1。如果将其设置为 1,则会提前创建第二个选项卡,而不是第三个选项卡。
要在选择第二个标签时加载广告,您必须使用 ViewPager 的 pageChangeListener 并检查是否选择了第二个标签,显示广告。
viewPager.setOnPageChangeListener(new OnPageChangeListener() {
public void onPageScrollStateChanged(int state) {}
public void onPageScrolled(int position, float positionOffset, int positionOffsetPixels) {}
public void onPageSelected(int position) {
if(position == 1)
displayInterstitial();
}
});
并且不要忘记从片段中删除 ((MainActivity)getActivity()).displayInterstitial();
。