如何编写一个通用公共函数来加载Activity,ListActivity和PreferenceActivity的Admob广告?

时间:2014-08-21 00:45:51

标签: java android admob

代码1和代码2重复代码。我尝试编写一个公共函数Code 3并调用代码1和代码2中的函数。

但代码中的常见公共函数SetAD不起作用,adView = (AdView)myContext.findViewById(R.id.adView)会导致错误。我能做什么?谢谢!

代码1

public class CallerMain extends Activity {
    private AdView adView;  

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.caller_main);

        if (getResources().getBoolean(R.bool.IsRegistered)==false) {
            adView = (AdView)this.findViewById(R.id.adView);
            AdRequest adRequest = new AdRequest.Builder()
                         .addTestDevice(AdRequest.DEVICE_ID_EMULATOR)
                         .build();
            adView.loadAd(adRequest);
        }   

    }   

}

代码2

public class CallPreference extends PreferenceActivity{
    private AdView adView;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        addPreferencesFromResource(R.xml.callpreference);
        setContentView(R.layout.caller_custom_preference);

        if (getResources().getBoolean(R.bool.IsRegistered) == false) {
            adView = (AdView) this.findViewById(R.id.adView);
            AdRequest adRequest = new AdRequest.Builder().addTestDevice(
                    AdRequest.DEVICE_ID_EMULATOR).build();
            adView.loadAd(adRequest);
        }

    }   

}

代码3

public class PublicParFun {

    public static void SetAD(AdView adView,Context myContext){  
        if (myContext.getResources().getBoolean(R.bool.IsRegistered)==false) {
            adView = (AdView)myContext.findViewById(R.id.adView);  //Case error
            AdRequest adRequest = new AdRequest.Builder()
                         .addTestDevice(AdRequest.DEVICE_ID_EMULATOR)
                         .build();
            adView.loadAd(adRequest);
        }
    }

}

2 个答案:

答案 0 :(得分:1)

这是继承树:

java.lang.Object
   ↳    android.content.Context
       ↳    android.content.ContextWrapper
           ↳    android.view.ContextThemeWrapper
               ↳    android.app.Activity
                   ↳    android.app.ListActivity
                       ↳    android.preference.PreferenceActivity

正如您所看到的,PreferenceActivityActivity都继承自上下文,但findViewById方法仅在课程Activity中可用。

从OOP的基础知识中,我们知道,一个类可以毫无问题地投射到它的父类,因此PreferenceActivityActivity都可以强制转换Activity并使方法findViewById可用。

tl; dr 只需将方法的参数从上下文更改为活动:

public class PublicParFun {
    public static void SetAD(AdView adView, Activity myContext){
        ...
    }
}

答案 1 :(得分:1)

在我看来,你根本不需要Context。你甚至可以通过传递给SetAD函数的一个参数来做到这一点。在我看来,将Activity对象传递给此函数并不是一个好习惯。因为这样做可能会违反Single Responsibility Principle

显而易见,此功能的责任是在AdView上设置一些广告。此责任不包括从活动中获取AdView的参考。 (假设另一个活动为AdView选择了不同的ID)

因此,应将此常规功能修改为:

public class PublicParFun {

    public static void setAdIfNotRegistered(AdView adView){
        if(adView.getContext().getResources().getBoolean(R.bool.IsRegistered) == false)
            SetAD(adView);
    }    

    public static void SetAD(AdView adView){  
        AdRequest adRequest = new AdRequest.Builder()
            .addTestDevice(AdRequest.DEVICE_ID_EMULATOR)
            .build();
        adView.loadAd(adRequest);
    }

}

代码1中的用法(类似于代码2)

public class CallerMain extends Activity {
    private AdView adView;  

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.caller_main);

        PublicParFun.setAdIfNotRegistered((AdView)findViewById(R.id.adView));
    }   
}