将值传递给另一个类

Posted

技术标签:

【中文标题】将值传递给另一个类【英文标题】:Passing a value to another class 【发布时间】:2015-05-05 20:24:53 【问题描述】:

我正在开发一个在MainActivity 上有操纵杆的应用程序。操纵杆是一个自定义视图并且有一个操纵杆类。当用户触摸操纵杆并移动它时,我希望将 Y 轴值发送到 MainActivity 以便我可以使用该值。

在 Joystick.java 中,我有一个 onTouch() 监听器。触摸时,操纵杆会生成坐标(操纵杆的 X 和 Y),这样我就可以在 Y 轴上获得一个从 -100 到 100 的值。

public class Joystick extends View implements OnTouchListener
    int xAxis, yAxis;

    public int getYAxis()
        return yAxis;
    

    @Override
    public boolean onTouch(View arg0, MotionEvent event)
        // Code to process event and assign xAxis and yAxis values (-100, 100)
    

MainActivity 中,我尝试执行以下操作来获取yAxis 值:

@Override
public void onCreate(Bundle savedInstanceState)
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);

    // ... other code

    Joystick joy = (Joystick) findViewById(R.id.joystick1);
    joy.setOnTouchListener(new View.OnTouchListener()
        @Override
        public boolean onTouch(View v, MotionEvent event)
            // updateMotorControl() is the funcion I need to pass my value to
            updateMotorControl(joy.getYAxis(), 0);

            return true;
        
    

当然,androidStudio 会告诉我 joy 需要被声明为 final。问题在于,如果它是最终的,我将永远无法更新该值。

我已经尝试了一百万件事,但我不断收到类似的错误。我不是在问我为什么会收到这个错误。我想知道的是将该值传递给MainActivity 并依次传递给updateMotorControl() 的最佳方式是什么?

【问题讨论】:

不能通过构造函数传递吗? 你可以用this代替joy(或者直接写getYAxis());) @ChrisBolton 我明白你的意思,但我不确定它是如何工作的。你能告诉我如何在代码中做到这一点吗? “问题在于,如果它是最终的,我永远无法更新值” 不一定,您不能更改引用。但是你可以改变它的属性 您是否尝试过制作joy final,但没有成功?没关系,只有引用不能改变,字段不能改变。 【参考方案1】:

你应该创建一个新界面

public interface DataCallback 
        /**
         * This method is called when xAxis and yAxis change.
         * @param instance
         */
        void dataIsAvailableNow(int x, int y);
    

在操纵杆中添加一个 DataCallback 字段:

public class Joystick extends View implements OnTouchListener
        int xAxis, yAxis;
        DataCallback mCallback;

        public int getYAxis()
            return yAxis;
        

        public void setCallback(DataCallback callback) 
            this.mCallback = callback;
        

        @Override
        public boolean onTouch(View arg0, MotionEvent event)
            // Code to process event and assign xAxis and yAxis values (-100, 100)
            if (mCallback != null) 
                mCallback.dataIsAvailableNow(-100,100);
            
        
    

并在MainActivity中实现接口并设置监听器

joy.setCallback(this);

【讨论】:

【参考方案2】:

来吧,让快乐成为最终的。 'final' 并不意味着您不能更改对象内部的值;这仅意味着您不能替换对象本身。回想一下,Java 传递对象作为它们的参考值 - 使操纵杆最终只是意味着你不能用另一个实例替换它。

【讨论】:

但是当我从 updateMotorControl() 读取值时,即使我移动操纵杆,它们也会保持为 0 你是否拦截了两次触摸事件?实际上,您似乎正在替换“ // 处理事件并分配 xAxis 和 yAxis 值 (-100, 100) 的代码”中的任何代码。【参考方案3】:

你可以实现一个回调函数。

请看这里: Callback functions in Java 和这里: How do I perform a JAVA callback between classes?

【讨论】:

以上是关于将值传递给另一个类的主要内容,如果未能解决你的问题,请参考以下文章

将值传递给另一个组件

如何将值传递给另一个视图控制器?

将值传递给另一个类

如何使用 nodejs 将值传递给另一个函数?

动态地将值(例如:innerHTML)传递给另一个元素作为值

Flutter:如何将值从 streamprovider / listview builder 传递给另一个类