Java 如何在另一个非活动类中调用主活动方法

Java 如何在另一个非活动类中调用主活动方法,java,android,Java,Android,下面是我使用ColorChange方法的主要活动。我想在ImageColor类中调用这个ColorChange方法 public class MainActivity extends AppCompatActivity { @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setConten

下面是我使用
ColorChange
方法的主要活动。我想在
ImageColor
类中调用这个
ColorChange
方法

    public class MainActivity extends AppCompatActivity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {

        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

    }

    public void ColorChange() {   // <----- Want to call this method in below class

     ImageView blue = (ImageView) findViewById(R.id.imageView);
     blue.setColorFilter(0xff000000);

     }
    }

我已经尝试使用
Mainactivity
作为对象,它会使我的应用程序崩溃。我也无法声明我的
ColorChange
方法
static
,因为它使用
findViewbyid
。请告诉我是否有任何方法可以在这个图像颜色类中调用颜色更改方法。

活动类是由Android创建的。因此,上述方法是不正确的

有两种方法可以访问活动中的方法

一,。使用静态方法

public static void ColorChange() {   
 ImageView blue = (ImageView) findViewById(R.id.imageView);
 blue.setColorFilter(0xff000000);
 }
}
  • 使用回调机制

    public interface ImageLoadedcallback{
        void onColorChanged(int color);
    }
    
  • 更新

        public class ImageColor {
                public void Imager(ImageLoadedcallback callback) {
                callback.onColorChanged(color)
                }
        }
    
    在活动中

    public void ColorChange() { 
        new ImageLoader().Imager(new ImageLoadedcallback{
           @Override
           public void onImageLoaded(Color color){
                 ImageView blue = (ImageView) findViewById(R.id.imageView);
                 blue.setColorFilter(0xff000000);
           });
     }
    

    活动类由Android创建。因此,上述方法是不正确的

    有两种方法可以访问活动中的方法

    一,。使用静态方法

    public static void ColorChange() {   
     ImageView blue = (ImageView) findViewById(R.id.imageView);
     blue.setColorFilter(0xff000000);
     }
    }
    
  • 使用回调机制

    public interface ImageLoadedcallback{
        void onColorChanged(int color);
    }
    
  • 更新

        public class ImageColor {
                public void Imager(ImageLoadedcallback callback) {
                callback.onColorChanged(color)
                }
        }
    
    在活动中

    public void ColorChange() { 
        new ImageLoader().Imager(new ImageLoadedcallback{
           @Override
           public void onImageLoaded(Color color){
                 ImageView blue = (ImageView) findViewById(R.id.imageView);
                 blue.setColorFilter(0xff000000);
           });
     }
    

    这样试试。它会帮助你的

    public class ImageColor {
    
    
       public void Imager(Activity activity) {
                 // Want to call my ColorChange method here
             if(activity instance of MainActivity)
                   ((MainActivity)activity).ColorChange(); //<-------- Using mainactiviy object crashes my app.
     }
    }
    
    公共类ImageColor{
    公共真空成像仪(活动){
    //想在这里调用我的ColorChange方法吗
    if(MainActivity的活动实例)
    
    ((MainActivity)activity.ColorChange();//试试这种方法。它会对您有所帮助

    public class ImageColor {
    
    
       public void Imager(Activity activity) {
                 // Want to call my ColorChange method here
             if(activity instance of MainActivity)
                   ((MainActivity)activity).ColorChange(); //<-------- Using mainactiviy object crashes my app.
     }
    }
    
    公共类ImageColor{
    公共真空成像仪(活动){
    //想在这里调用我的ColorChange方法吗
    if(MainActivity的活动实例)
    
    ((MainActivity)activity.ColorChange();//使用接口与非活动类中的活动进行通信。在接口中创建ColorChange(),在非活动类中获取接口的实例并调用该方法

    class MainActivity {
    
        interface mInterface = new interface() {
            public void colorChange(){
    
            }
    
        }
    }
    

    将mInterface传递给非活动类,并在需要时调用接口的colorChange。

    使用接口与非活动类中的活动进行通信。在接口中创建colorChange(),在非活动类中获取接口的实例并调用该方法

    class MainActivity {
    
        interface mInterface = new interface() {
            public void colorChange(){
    
            }
    
        }
    }
    

    将mInterface传递给非活动类,并在需要时调用接口的colorChange..

    您必须在
    ImageColor
    类中将活动作为参数传递

    然后通过引用活动调用ColorChange()方法

    像这样-

    public class ImageColor {
    
        Activity activity;
    
        public ImageColor(Activity activity)
        {
            this.activity = activity;
        }
    
        public void Imager() 
        {
            if(activity instance of MainActivity)
                ((MainActivity)activity).ColorChange();
        }
    }
    

    您必须在
    ImageColor
    类中将活动作为参数传递

    然后通过引用活动调用ColorChange()方法

    像这样-

    public class ImageColor {
    
        Activity activity;
    
        public ImageColor(Activity activity)
        {
            this.activity = activity;
        }
    
        public void Imager() 
        {
            if(activity instance of MainActivity)
                ((MainActivity)activity).ColorChange();
        }
    }
    

    为了清楚起见,将活动作为静态变量可能导致活动泄漏,因此我们必须避免这样做。 我假设,如果创建ImageColor对象的活动是MainActivity,那么可以直接传递MainActivity来实现所需的功能

    public class ImageColor {
    
        public void Imager(MainActivity activity) {
            activity.ColorChange();
        }
    }
    
    若您从其他类(而不是从MainActivity)调用它,则始终可以将MainActivity传递给要用于ImageColor对象的其他类对象


    PS:也检查一下java命名约定,它将帮助您编写更好的代码。为了弄清楚,将活动作为静态变量可能导致活动泄漏,所以我们必须避免这样做。 我假设,如果创建ImageColor对象的活动是MainActivity,那么可以直接传递MainActivity来实现所需的功能

    public class ImageColor {
    
        public void Imager(MainActivity activity) {
            activity.ColorChange();
        }
    }
    
    若您从其他类(而不是从MainActivity)调用它,则始终可以将MainActivity传递给要用于ImageColor对象的其他类对象


    PS:也检查一下java命名约定,它将帮助您编写一个更好的代码,您需要在哪里调用ImageColor类?我想在ImageColor中调用ColorChange,然后使用ImageColor来更改imageview的颜色。这是一个示例项目,我试图了解如何从其他类调用main activity方法,您无法做到这一点正如您所看到的,如果您从另一个activityClass调用同一类方法,则视图(ImageView)仅在MainActivity中。您的视图将找不到其引用,并且应用程序崩溃,异常可能为nullObjectuse接口,以与非activity类中的活动通信。create colorChange()在接口中,获取非活动类中接口的实例并调用该方法。是的,这正是错误,我得到null异常…如何解决此问题?在哪里需要调用ImageColor类?我想在ImageColor中调用ColorChange,然后使用ImageColor更改imageview的颜色。这是一个示例项目,我正在尝试了解如何从其他类调用主活动方法您不能这样做,因为您可以看到视图(ImageView)仅当您从另一个activityClass调用同一类方法时,在MainActivity中,您的视图将找不到它的引用,并且应用程序会崩溃,异常可能为nullObjectuse interface以与非活动类中的活动通信。create colorChange()在接口中,获取非活动类中接口的实例,并调用该方法。是的,这正是错误,我得到null异常…我如何解决此问题?您不能在静态方法中调用findViewById ha ha ha ha ha。将视图设为全局视图,并在OnCreateView中初始化我刚刚给出了逻辑。不要复制粘贴复制pas之前请思考您不能在静态方法中调用findViewById。请将视图设置为全局视图,并在oncreateViewI中初始化。我刚刚给出了逻辑。不要复制粘贴,复制粘贴之前先考虑一下。