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()函数。

猜你喜欢

转载自blog.csdn.net/qq_34205684/article/details/110822168