steven
steven

Reputation: 698

Pass data from the Activity to SurfaceView

I'm not sure where the problem is. I thought if the activity would pass information to the surfaceview it implements. Basically I'm trying to make it so that when someone selects their choice of game layout from the main menu (passes it with Intent) it then goes to the PlayGame class. (I have it take the number given from the intent). That activity uses SurfaceView through a layout. Then down in the surface view where it calls the images and assigns them I tried using an if else to determine which pictures it should be using. Didn't work. Not exactly sure what to do about it. If there is a better way to make it use the images from a previous selection on the main page. Looks like this.

Main Class (Just one of the buttons passing in intent)

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 Class

 @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); 


}

Game Class:

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);

    }

More images than just one, but to save space it's just the one. Any help would be appreciated. I'm sure I must have done something wrong there.

EDIT: Here is the log cat from the force close caused from this setup.

06-06 17:55:01.655: ERROR/AndroidRuntime(16229): FATAL EXCEPTION: main 06-06 17:55:01.655: ERROR/AndroidRuntime(16229): java.lang.RuntimeException: Unable to start activity ComponentInfo{fallacystudios.gnarlyned/fallacystudios.gnarlyned.PlayGame}: android.view.InflateException: Binary XML file line #7: Error inflating class fallacystudios.gnarlyned.GameLoopView 06-06 17:55:01.655: ERROR/AndroidRuntime(16229): at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2663) 06-06 17:55:01.655: ERROR/AndroidRuntime(16229): Caused by: android.view.InflateException: Binary XML file line #7: Error inflating class fallacystudios.gnarlyned.GameLoopView 06-06 17:55:01.655: ERROR/AndroidRuntime(16229): Caused by: java.lang.reflect.InvocationTargetException 06-06 17:55:01.655: ERROR/AndroidRuntime(16229): Caused by: java.lang.NullPointerException

Then a whole bunch of heap size overflow

All this only happens when I have the if(gameType == 1) and else if(gameType == 2) in the loadImages section. Doing this to make it so only certain images are used when that map is selected. Not sure why that doesnt work.

Upvotes: 2

Views: 1746

Answers (3)

user5943823
user5943823

Reputation:

set type to public static in PlayGame Class and call intent extra before calling setContentView as Ted Hopp mentioned.

Upvotes: 0

user3457079
user3457079

Reputation: 29

I've kind of done what you're attempting. My solution was to set all the views in inner classes and then do your layout dynamically. That way every widget/view can see what the other is doing.

Upvotes: 0

Ted Hopp
Ted Hopp

Reputation: 234795

If loadImages is being called from the Game constructor, then the problem is that when you inflate the view, you haven't yet defined playGame.type. Try extracting the intent extra before calling setContentView.

Upvotes: 1

Related Questions