Как вызвать метод активности из вида? - PullRequest
0 голосов
/ 13 мая 2019

Я сделал свою игру, в которой я хочу вызвать метод, который у меня есть в представлении из другого представления.Я подумал, что мне как-то придется отправить «первое представление» во «второе представление» через мой 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 ИЛИ как вызвать handleAvoidedBall () в MainActivity из представления SmallBall?

Спасибо за потраченное время и надеюсь, что у вас замечательный день!

Ответы [ 3 ]

1 голос
/ 13 мая 2019

Лучшим вариантом будет определить прослушиватель, который вы установите в SmallBallView.

Определите слушателя:

public interface BallListener {
    void onAvoided(SmallBall ball);
}

И тогда внутри вашего класса SmallBall у вас будет такой метод:

public void setListener(BallListener listener){
    this.listener = listener;
}

А затем вызовите это в своей деятельности после того, как вы создали экземпляр класса SmallBall:

smallBall.setListener(new SmallBallListener(){
    @Override
    public void onAvoided(SmallBall ball){
        // Do stuff here
    }
})
0 голосов
/ 14 мая 2019

Как упомянул @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(), он вызовет onAvoidedBall() метод в классе MainActivity.

0 голосов
/ 14 мая 2019

Оказывается, все, что мне нужно было сделать, это установить:

private FishView gameView;

до:

public static FishView gameView;

А затем просто используйте «MainActivity.gameView» в представлении SmallBall. Это не дало мне никаких дополнительных противоречий, так что это тоже хорошо.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...