Java 如何编写公共函数为Activity、ListActivity和PreferenceActivity加载Admob广告?

Java 如何编写公共函数为Activity、ListActivity和PreferenceActivity加载Admob广告?,java,android,admob,Java,Android,Admob,代码1和代码2有重复的代码。我试图编写一个公共函数代码3,并在代码1和代码2中调用该函数 但是代码中的公共函数SetAD不起作用,adView=(adView)myContext.findView(R.id.adView)会导致错误。我能做什么?谢谢 代码1 public class CallerMain extends Activity { private AdView adView; @Override protected void onCreate(Bundl

代码1和代码2有重复的代码。我试图编写一个公共函数代码3,并在代码1和代码2中调用该函数

但是代码中的公共函数
SetAD
不起作用,
adView=(adView)myContext.findView(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);
        }
    }

}

以下是继承树:

java.lang.Object
   ↳    android.content.Context
       ↳    android.content.ContextWrapper
           ↳    android.view.ContextThemeWrapper
               ↳    android.app.Activity
                   ↳    android.app.ListActivity
                       ↳    android.preference.PreferenceActivity
正如您可以看到的那样,
PreferenceActivity
Activity
继承自上下文,但是,
findViewById
方法仅在类
Activity
中可用

从OOP的基础知识来看,我们知道,一个类可以毫无问题地转换为它的父类,因此
PreferenceActivity
Activity
都可以转换为
Activity
,并使方法
findViewById
可用

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

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

在我看来,你根本不需要一个
上下文
。您甚至可以只通过将一个参数传递给
SetAD
函数来实现这一点。在我看来,将
活动
对象传递给此函数不是一个好的做法。因为这样做可能违反法律

显然,此功能的职责是在
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类似)


导致了什么样的错误?adView=(adView)myContext.findViewById(R.id.adView)导致错误,myContext没有方法FindViewByEdit也应该将活动传递给该方法,findViewById是Activity中的一个方法,但是主布局中有PreferenceActivity、ListActivity,我可以强制将它们转换为Activity吗?谢谢!您的代码确实有效,但我不明白为什么我可以使用(AdView)findViewById(R.id.AdView)和AdView.getContext()。@HelloCW我很高兴能帮助您,我已经将
(AdView)findViewById(R.id.AdView)
移动到创建时的活动
,因为它与该活动相关(它包含在活动职责中,而不是一般功能中). 而
adView.getContext()
是一种从现有视图获取上下文的方法。@HelloCW您可以将
(adView)findViewById(R.id.adView)
移动到该常规函数,不会发生错误,但它违反了我在回答中提到的原则谢谢!这是否意味着所有活动、ListActivity和PreferenceActivity布局都可以使用(AdView)findViewById(R.id.AdView)?Adview是Activity、ListActivity和PreferenceActivity的父级吗?@HelloCW所有具有
Adview
的活动都可以将其Adview传递给该general您的第二个问题:否,活动是其内容的父级(即它们拥有的所有视图)
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));
    }   
}