首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >如何从视图中调用activity方法?

如何从视图中调用activity方法?
EN

Stack Overflow用户
提问于 2019-05-14 04:30:43
回答 3查看 413关注 0票数 0

我做了一个游戏,在游戏中,我想从另一个视图调用我在视图中拥有的方法。我想,为了让第二个视图能够调用第一个视图的方法,我必须通过my MainActivity将“第一个视图”发送到“第二个视图”中。然而,我想不出任何方法通过我的MainAcitivity把第一个视图发送到第二个视图,所以我决定改变策略。现在,我尝试在MainActivity中使用一个函数来处理视图之间的交互,但再次无法从第二个视图中调用该方法。

因此,我的问题是,如何通过活动将视图发送到另一个视图,或者如果不可能,如何通过视图调用活动方法?

以下是代码(我添加了一些注释以更好地显示我遇到的问题):

代码语言:javascript
运行
复制
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();
    }

}
代码语言:javascript
运行
复制
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()?

感谢您的宝贵时间,希望您有一个美好的一天!

EN

Stack Overflow用户

回答已采纳

发布于 2019-05-14 06:06:11

正如@LukeWaggoner所提到的,你应该考虑在你的活动中使用监听器而不是使视图成为静态的。

您告诉我们,您希望添加多个SmallBall视图,所以我认为您不希望为每个视图都编写侦听器的代码。

使用MainActivity实现SmallBallListener很容易做到这一点。

监听程序:

代码语言:javascript
运行
复制
public interface SmallBallListener {
    void onAvoidedBall();
}

SmallBall类:

代码语言:javascript
运行
复制
public void setListener(SmallBallListener listener){
    this.listener = listener;
}

MainActivity

代码语言:javascript
运行
复制
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()方法。

票数 0
EN
查看全部 3 条回答
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/56119509

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档