代码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);
}
}
}
答案 0 :(得分:1)
这是继承树:
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){
...
}
}
答案 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));
}
}