将值传递给另一个类
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?
【讨论】:
以上是关于将值传递给另一个类的主要内容,如果未能解决你的问题,请参考以下文章