Передать данные из Activity в SurfaceView

Я не уверен, в чем проблема. Я подумал, будет ли активность передавать информацию на поверхность, которую она реализует. В основном я пытаюсь сделать так, чтобы когда кто-то выбирает свой выбор игрового макета в главном меню (передает его с намерением), он затем переходит к классу PlayGame. (У меня это взять число, данное от намерения). Это действие использует SurfaceView через макет. Затем в представлении поверхности, где он вызывает изображения и назначает их, я попытался использовать 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): НЕИСПРАВНОЕ ИСКЛЮЧЕНИЕ: основной gnarlyned/fallacystudios.gnarlyned.PlayGame}: android.view.InflateException: строка двоичного XML-файла № 7: ошибка при раздувании класса fallacystudios.gnarlyned.GameLoopView 06-06 17:55:01.655: ERROR/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. Исключение нулевого указателя

Затем целая куча переполнения размера кучи

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


person steven    schedule 05.06.2011    source источник
comment
Что на самом деле не работает? Я не думаю, что понимаю, в чем именно проблема.   -  person Austin    schedule 05.06.2011
comment
Когда именно вызывается метод loadImage(Context context)? Конструктор класса Game? Из объекта PlayGame gameLoopView? Какой тип у playGame.type, int или Integer?   -  person Joe    schedule 05.06.2011
comment
@Joe loadImage вызывается в общедоступной игре (контекст контекста) в SurfaceView. Surfaceview вызывается из onCreate в PlayGame. Тип playGame — это int.   -  person steven    schedule 05.06.2011


Ответы (3)


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

person Ted Hopp    schedule 05.06.2011
comment
@TedHopp Dang Я думал, что это сработает, но это все еще создает мне проблемы. Не совсем уверен, что это такое. Спасибо хоть. - person steven; 05.06.2011
comment
Странный. Вы убедились, что тип, извлекаемый из намерения в PlayGame.onCreate, определенно является тем, который был передан из метода Main? И если да, то его точно не видно в игре? (Обычно я использую недопустимое значение по умолчанию для getIntExtra, чтобы знать, правильно ли оно вызывается.) - person Ted Hopp; 05.06.2011
comment
@TedHopp Да, это то же самое, что передается в main. И он извлекается до setcontentview. Просто когда я пытаюсь получить его в поверхностном представлении, он его не получит. Он принудительно закрывается (я опубликую логарифм выше) - person steven; 06.06.2011
comment
Принудительное закрытие вызвано NullPointerException в Game.loadImages в строке 524. Я не знаю точно, что это за строка, но, глядя на ваш код, мне кажется, что наиболее вероятной проблемой является то, что playGame не был инициализирован, когда вызывается loadImages. - person Ted Hopp; 06.06.2011
comment
@TedHopp Это странно. Я попытался создать переменную в игре, и я попытался установить ее равной нулю и установить ее равной playGame.type до вызова loadImages. Stil дает мне исключение нулевого указателя. Кстати, как мне заставить его отображать числа для строк. Я посмотрю, что там в этой строке. - person steven; 06.06.2011
comment
Царапина, которую я нашел, как включить числа. Вот где он говорит, что это происходит. Это в loadImages - person steven; 06.06.2011
comment
'if(type == 1){ skyImage = BitmapFactory.decodeResource(res, R.drawable.sky); GroundImage = BitmapFactory.decodeResource(res, R.drawable.ocean); разделительImage = BitmapFactory.decodeResource(res, R.drawable.ocean); препятствие1Image = BitmapFactory.decodeResource(res, R.drawable.shark); drinkImage = BitmapFactory.decodeResource(res, R.drawable.drink); препятствие2Image = BitmapFactory.decodeResource(res, R.drawable.log); препятствие3Image = BitmapFactory.decodeResource(res, R.drawable.bird); nedJumpImage = BitmapFactory.decodeResource(res, R.drawable.nedjump); }' - person steven; 06.06.2011
comment
Type это была моя попытка использовать переменную вместо playGame.type. Он устанавливается равным ему чуть выше. И переменная была инициализирована до нуля в начале. - person steven; 06.06.2011
comment
Я больше не могу следить за тем, что происходит. Не могли бы вы отредактировать свой пост, чтобы показать текущий код для PlayGame.onCreate, Game.loadImages и точную строку, которая генерирует NPE? - person Ted Hopp; 06.06.2011
comment
@TedHopp Хорошо, это изменилось. Выше я также пытался использовать этот type=playGame.type в методе первого контекста игры, и там он тоже не работал. О, и строка, о которой говорится, что она не работает, находится в последнем сообщении кода, где есть if. - person steven; 06.06.2011
comment
Вы хотите сказать, что эта строка: if (type == 1){ генерирует исключение NullPointerException? Я не думаю, что это возможно. Как насчет окружения вашего вызова loadImages блоком try/catch; поймать НПЭ; распечатать трассировку стека; показать Toast, что ничего не работает; и позвоните finish(). - person Ted Hopp; 06.06.2011
comment
Это номер строки, который он мне дал. Я попробую. Спасибо за вашу помощь. - person steven; 07.06.2011
comment
@TedHopp Хорошо, попробовал. Насколько я могу судить, он даже не дошел до этой части. Я получил большое количество исключений. - person steven; 07.06.2011
comment
@TedHopp Хорошо, после исключения вещей я обнаружил, что фактический NullPointer не является if. Это тип = playGame.type. Теперь я попробовал это в loadImages(), Game() и в общедоступном классе. Ошибка logcat следует за ним. Не совсем уверен, почему он получает нулевой указатель. Разве он не должен получать информацию из класса PlayGame? - person steven; 07.06.2011
comment
Как вы инициализируете playGame? - person Ted Hopp; 07.06.2011
comment
@TedHopp PlayGame класс или playGame.type? Класс – это деятельность. Если вы имеете в виду, как он инициализируется в игре SurfaceView, это PlayGame playGame; . Если вы имеете в виду тип, он устанавливается равным нулю в классе PlayGame, а перед setContentView он открывается и получает тип намерения. - person steven; 07.06.2011

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

person user3457079    schedule 03.07.2012

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

person Community    schedule 03.04.2017