Как изменить активность в Android? - PullRequest
1 голос
/ 12 апреля 2011


Я делаю простую игру.У меня есть 3 мероприятия.Первое действие - это главное меню (класс FirstActivity).
Первое действие имеет следующий код:

Intent i = new Intent(this, SecondActivity.class);  
startActivityForResult(i, ACTIVITY_CREATE);

Вызывает второе действие, где второе действие имеет следующий код:

setContentView(new MovementView(this));

MovementViewкласс расширяет SurfaceView.Класс MovementView - это место, где я пишу весь код игры.

Поэтому я хочу, чтобы при жизни == 0 он изменялся на ThirdActivity.Как мне это сделать?
Я попытался поместить код, похожий на класс FirstActivity, но, похоже, он не работает.
Если я добавлю
((Activity)getContext()).finish();
, он просто возвращается к FirstActivity, ноэто не то, что мне нужно, мне нужно, чтобы перейти в класс ThirdActivity.

Ответы [ 4 ]

3 голосов
/ 13 апреля 2011

Наконец я могу ответить, пришлось ждать 24 часа.
В итоге единственный вариант, который мне удалось заставить работать, был такой:
FirstActivity класс:
по клику

private void startGame() {
        Intent i = new Intent(this, SecondActivity.class);
        startActivity(i);
    }

Второй класс активности:

protected void onCreate(Bundle savedInstanceState) {
setContentView(new MovementView(this));
}        
    @Override
    protected void onDestroy() {
        Intent i = new Intent(this, GameOver/*GameOver=ThirdActivity*/.class);
        startActivity(i);
        super.onDestroy(); 
    }

Класс MovementView:

if (lives == 0){            
updateThread.setRunning(false);
((Activity)getContext()).finish();
}

Я не знаю, что разница между onDestroy и onStop, но оба работают. Единственная неприятная вещь заключается в том, что при жизни == 0 он возвращается к FirstActivity (примерно на полсекунды) и только затем к классу GameOver.

2 голосов
/ 12 апреля 2011

Это не сработало, когда вы пытались, потому что вы пытаетесь создать намерение из представления, а не из действия. Вам нужно будет использовать контекст представления (getContext()) вместо this. Вам также нужно будет использовать startActivity вместо startActivityForResult, если только вы на самом деле не планируете использовать результат (хотя приведение контекста к Activity должно быть достаточно безопасным, если вы используете его только из своего собственного кода) .

1 голос
/ 12 апреля 2011

Поскольку вы начинаете Activity2 с ..ForResult(), вы также можете установить результат 2-го действия (с setResult(GAME_OVER) до его завершения), чтобы Activity1 запускалось Activity3 в onActivityResult(), если имеет смысл, что Activity2 больше не существует, когда было показано Activity3 ...

RE: @ Йони Самлан, хорошо, если я поставлю

Intent i = new Intent(this, ThirdActivity.class);
startActivityForResult(i, ACTIVITY_CREATE);

Он показывает Конструктор Intent (MovementView, Class) не определен для первой строки и Метод startActivityForResult (Intent, int) не определено для типа MovementView для второй строки.

Вы должны передать Activity в качестве первого аргумента, а не представления, и вызвать Activity.startActivityForResult() ... Так что передайте ваш Activityна ваш взгляд и используйте его там, как описано.

0 голосов
/ 12 апреля 2011

с конструктором MovementView вы должны запомнить действие, используя его для запуска третьего действия.

private Activity a;

public MovementView(Acitivity a) {
  this.a = a;
  // your code
}

где-то в MovementView, замените

Intent i = new Intent(this, ThirdActivity.class);  

от

Intent i = new Intent(a, ThirdActivity.class);  
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...