Передать данные из Activity в SurfaceView - PullRequest
2 голосов
/ 05 июня 2011

Я не уверен, где проблема. Я думал, что если действие передаст информацию в представление поверхности, которое оно реализует. По сути, я пытаюсь сделать так, чтобы, когда кто-то выбирает игровой макет из главного меню (передает его с помощью Intent), он затем переходит в класс PlayGame. (У меня это взять число, данное из намерения). Эта деятельность использует SurfaceView через макет. Затем вниз в виде поверхности, где он вызывает изображения и присваивает их, я попытался использовать if if else, чтобы определить, какие изображения он должен использовать. Не сработало Не совсем уверен, что с этим делать. Если есть лучший способ сделать это, используйте изображения из предыдущего выбора на главной странице. Похоже на это.

Основной класс (только одна из кнопок, передаваемых в намерении)

Button surfButton = (Button) findViewById(R.id.play1_btn);
    surfButton.setOnClickListener(new View.OnClickListener()
    {
        public void onClick(View surfing)
        {
            Intent play = new Intent(Main.this, PlayGame.class);
            play.putExtra("gameType" , 1);
            startActivity(play);
        }
    });

Класс PlayGame

 @Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);  
    Intent typ = getIntent();
    type = typ.getIntExtra("gameType", 0);

    setContentView(R.layout.game);        
    gameLoopView = (GameLoopView) findViewById(R.id.gnarlyned); 


}

Игровой класс:

private void loadImages(Context context) {
            type = playGame.type;
    Resources res = context.getResources();

    if (type == 1){
        skyImage = BitmapFactory.decodeResource(res, R.drawable.sky);

    }
    else if (type == 2){
        skyImage = BitmapFactory.decodeResource(res, R.drawable.snowbg);

    }

Больше изображений, чем одно, но для экономии места это только одно. Любая помощь будет оценена. Я уверен, что, должно быть, я сделал что-то не так.

РЕДАКТИРОВАТЬ: Вот журнал регистрации от силы закрытия, вызванной этой настройкой.

06-06 17: 55: 01.655: ОШИБКА / AndroidRuntime (16229): ИСКЛЮЧИТЕЛЬНОЕ ИСКЛЮЧЕНИЕ: основное 06-06 17: 55: 01.655: ОШИБКА / AndroidRuntime (16229): java.lang.RuntimeException: невозможно запустить действие ComponentInfo {fallacystudios.gnarlyned / fallacystudios.gnarlyned.PlayGame}: android.view.InflateException: строка двоичного файла XML # 7: Ошибка надувания класса fallacystudios.gnarlyned.GameLoopView 06-06 17: 55: 01.655: ОШИБКА / AndroidRuntime (16229): на android.app.ActivityThread.performLaunchActivity (ActivityThread.java:2663) 06-06 17: 55: 01.655: ОШИБКА / AndroidRuntime (16229): вызвано: android.view.InflateException: строка двоичного файла XML # 7: ошибка надувания класса fallacystudios.gnarlyned.GameLoopView 06-06 17: 55: 01.655: ОШИБКА / AndroidRuntime (16229): вызвано: java.lang.reflect.InvocationTargetException 06-06 17: 55: 01.655: ОШИБКА / AndroidRuntime (16229): вызвано: java.lang.NullPointerException

Тогда переполнение целой кучей кучи

Все это происходит только тогда, когда у меня есть if (gameType == 1) и еще if (gameType == 2) в разделе loadImages. Это делается для того, чтобы при выборе этой карты использовались только определенные изображения. Не уверен, почему это не работает.

Ответы [ 3 ]

1 голос
/ 05 июня 2011

Если из конструктора Game вызывается loadImages, проблема в том, что когда вы раздуваете представление, вы еще не определили playGame.type.Попробуйте извлечь дополнительное намерение перед вызовом setContentView.

0 голосов
/ 03 апреля 2017

установите type в public static в PlayGame Класс и намерение вызова дополнительно перед вызовом setContentView, как упомянул Тед Хопп.

0 голосов
/ 04 июля 2012

Я вроде сделал то, что вы пытаетесь. Мое решение состояло в том, чтобы установить все представления во внутренних классах, а затем динамически создавать макет. Таким образом, каждый виджет / представление может видеть, что делает другой.

...