我做了一个游戏,在游戏中,我想从另一个视图调用我在视图中拥有的方法。我想,为了让第二个视图能够调用第一个视图的方法,我必须通过my MainActivity将“第一个视图”发送到“第二个视图”中。然而,我想不出任何方法通过我的MainAcitivity把第一个视图发送到第二个视图,所以我决定改变策略。现在,我尝试在MainActivity中使用一个函数来处理视图之间的交互,但再次无法从第二个视图中调用该方法。
因此,我的问题是,如何通过活动将视图发送到另一个视图,或者如果不可能,如何通过视图调用活动方法?
以下是代码(我添加了一些注释以更好地显示我遇到的问题):
public class MainActivity extends AppCompatActivity {
private FishView gameView;
private SmallBall smallBall ;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
RelativeLayout screen = findViewById(R.id.gameScreen);
gameView = new FishView(this);
smallBall = new SmallBall(this);
screen.addView(gameView); // first view
screen.addView(smallBall); //second view
}
//this is the method I want to reach through the View
public void handleAvoidedBall(){
gameView.avoidedBall();
}
}public class SmallBall extends View {
private final Bitmap sodaCan;
private final static long smallBallPeriod = 60;
private final Handler handler = new Handler();
public SmallBall(Context context) {
super(context);
Paint smallBall = new Paint();
smallBall.setColor(Color.GRAY);
smallBall.setAntiAlias(false);
resetBall();
sodaCan = BitmapFactory.decodeResource(getResources(),R.drawable.sodacan);
Timer movementTimer = new Timer();
movementTimer.scheduleAtFixedRate(smallBallTask, 0, smallBallPeriod);
}
private final TimerTask smallBallTask = new TimerTask() {
@Override
public void run() {
handler.post(new Runnable() {
@Override
public void run() {
invalidate();
if (isBallLanded()){
//Here I want to call on a handleAvoidedBall() in MainActivity
//OR simply have gameView here if possible
// gameView.avoidedBall();
//OR
//SomeMainAcitvityObject.handleAvoidedBall();
}
}
});
}
};
@Override
protected void onDraw(Canvas canvas) {
..... //Do stuff}
}因此,我希望我现在已经解释了一些不错的内容,我想知道如何将gameView发送到SmallBall视图中,或者如何从SmallBall视图中调用MainActivity中的handleAvoidedBall()?
感谢您的宝贵时间,希望您有一个美好的一天!
发布于 2019-05-14 06:06:11
正如@LukeWaggoner所提到的,你应该考虑在你的活动中使用监听器而不是使视图成为静态的。
您告诉我们,您希望添加多个SmallBall视图,所以我认为您不希望为每个视图都编写侦听器的代码。
使用MainActivity实现SmallBallListener很容易做到这一点。
监听程序:
public interface SmallBallListener {
void onAvoidedBall();
}SmallBall类:
public void setListener(SmallBallListener listener){
this.listener = listener;
}MainActivity
public class MainActivity extends AppCompatActivity implements SmallBallListener {
private FishView gameView;
private SmallBall smallBall ;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
RelativeLayout screen = findViewById(R.id.gameScreen);
gameView = new FishView(this);
screen.addView(gameView); // first view
// Add 10 small ball views
for(int i = 0; i < 10; i++) {
SmallBall ball = new SmallBall(this);
ball.setListener(this); // MainActivity is a listener here, so each ball has the same listener code
screen.addView(ball);
}
}
//this is the method I want to reach through the View
public void handleAvoidedBall() {
gameView.avoidedBall();
}
@Override
public void onAvoidedBall() { // this is the SmallBallListener method
this.handleAvoidedBall();
}
}因此,无论哪个SmallBall视图调用listener.onAvoidedBall(),它都会在MainActivity类中触发onAvoidedBall()方法。
https://stackoverflow.com/questions/56119509
复制相似问题