Android普通类调用活动中函数的方法
假设已定义MainActivity活动和Student类。
MainActivity的代码为:
public class MainActivity extends AppCompatActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
}
public String getName(){
return "Tom";
}
}
Student的代码为:
public class Student {
public void fun(){
}
}
此时,要实现Student调用MainActivity的getName()函数。
一、活动名.函数名()
由于Activity是不能用new来实例化的,但可以通过活动名.函数名()来被调用。此时,被调函数需要用static关键字修饰。
MainActivity的代码为:
public class MainActivity extends AppCompatActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
}
public static String getName(){
return "Tom";
}
}
Student的代码为:
public class Student {
public void fun(){
String name = MainActivity.getName();
}
}
此时,Student成功调用MainActivity的getName()函数。
用这个方法,需要注意一些问题。因为static修饰的函数不能引用非静态字段,所以在getName()函数里不能用非静态变量、非静态控件等,如果要使用,需要将变量、控件用static修饰,但最好还是少使用静态字段。
另外,这个方法不支持在子线程中更新UI控件,即runOnUiThread()不能在用static修饰的函数中使用。
二、自定义一个类,通过该类间接调用
自定义一个类,该类会获取活动中的Context和Activity。所以,普通类可以通过该类间接调用活动里的函数。
自定义类IndirectClass代码为:
public class IndirectClass {
private Context contxt;
private MainActivity activity;
public Context getContxt() {
return contxt;
}
public void setContxt(Context contxt) {
this.contxt = (MainActivity) contxt;
}
public Activity getActivity() {
return (MainActivity) activity;
}
public void setActivity(Activity activity) {
this.activity = (MainActivity) activity;
}
public IndirectClass(Context context, MainActivity activity) {
this.setContxt(context);
this.setActivity(activity);
}
}
定义好后需要在MainActivity中声明初始化IndirectClass类,然后就可以在普通类中引用了。
MainActivity的代码为:
public class MainActivity extends AppCompatActivity {
public static IndirectClass indirectClass;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
// 对IndirectClass类进行初始化
indirectClass = new IndirectClass(this,MainActivity.this);
}
public String getName(){
return "Tom";
}
}
Student的代码为:
public class Student {
public void fun(){
// 引用IndirectClass类来调用MainActivity的函数
IndirectClass indirect= MainActivity.indirectClass;
Context context= (Context) indirect.getContxt();
MainActivity activity = (MainActivity) indirect.getActivity();
String name = activity.getName();
}
}
此时,Student成功调用MainActivity的getName()函数。