Java 如何编写公共函数为Activity、ListActivity和PreferenceActivity加载Admob广告?
代码1和代码2有重复的代码。我试图编写一个公共函数代码3,并在代码1和代码2中调用该函数 但是代码中的公共函数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
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));
}
}