Welcome to the Treehouse Community

The Treehouse Community is a meeting place for developers, designers, and programmers of all backgrounds and skill levels to get support. Collaborate here on code errors or bugs that you need feedback on, or asking for an extra set of eyes on your latest project. Join thousands of Treehouse students and alumni in the community today. (Note: Only Treehouse students can comment or ask questions, but non-students are welcome to browse our conversations.)

Looking to learn something new?

Treehouse offers a seven day free trial for new students. Get access to thousands of hours of content and a supportive community. Start your free trial today.

Android Intents and Broadcast Receivers For All Intents and Purposes Parcel All the Things!

Kyle Baker
Kyle Baker
8,211 Points

confused

Directions...

Add an EnergySource variable and set it to the extra from the Intent.

My code is...

import android.os.Bundle; import android.view.View;

public class TimeTravelActivity extends Activity {

public String targetYear;

@Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_time_travel);

Intent intent = getIntent();
targetYear = intent.getStringExtra("EXTRA_YEAR");
EnergySource source = intent.getParcelableExtra(MainActivity.EXTRA_ENERGY);

} }

My thoughts...

I thought EnergySource source = intent.getParcelableExtra(MainActivity.EXTRA_ENERGY); would do the trick since it's like Ben's Song song = intent.getParcelableExtra(MainActivity.EXTRA_SONG); but when I do it I get this error ./TimeTravelActivity.java:15: error: incompatible types: Parcelable cannot be converted to EnergySource EnergySource source = intent.getParcelableExtra(MainActivity.EXTRA_ENERGY);.

My confusion...

I just don't understand how it's ok to set your getParcelableExtra to a Song object but not an EnergySource object. Please help

MainActivity.java
import android.os.Bundle;
import android.view.View;
import android.widget.Button;
import android.widget.EditText;

public class MainActivity extends Activity {

  public Button goButton;
  public EditText yearField;

  @Override
  protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);

    goButton = (Button)findViewById(R.id.goButton);
    yearField = (EditText)findViewById(R.id.yearField);

    final EnergySource source = new EnergySource();

    goButton.setOnClickListener(new View.OnClickListener() {
      @Override
      public void onClick(View v) {
        // Add your code in here!
        Intent intent = new Intent(MainActivity.this, TimeTravelActivity.class);
        intent.putExtra("EXTRA_YEAR", yearField.getText().toString());
        intent.putExtra("EXTRA_ENERGY", source);
        startActivity(intent);
      }
    });
  }
}
TimeTravelActivity.java
import android.os.Bundle;
import android.view.View;

public class TimeTravelActivity extends Activity {

  public String targetYear;

  @Override
  protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_time_travel);

    Intent intent = getIntent();
    targetYear = intent.getStringExtra("EXTRA_YEAR");
    EnergySource source = intent.getParcelableExtra("EXTRA_ENERGY");
  }
}

So, I don't remember this class because it would have been a long time ago that I took it. However, I do know that what you must do is cast your parcelableExtra to type EnergySource. This is because the way the code is set up now, you're returning a Parcelable and trying to assign it to an EnergySource variable. What this would look like is below:

EnergySource source = (EnergySource) intent.getParcelableExtra("EXTRA_ENERGY");

I hope this helps somewhat.

Kyle Baker
Kyle Baker
8,211 Points

Oh I didn't even think to cast it. Thanks friend :)

1 Answer

Seth Kroger
Seth Kroger
56,405 Points

getParcelableExtra() returns a generic type, <T extends Parcelable> T, which slides past the usually required explicit cast. This is why the code you write for the app doesn't need it. But the challenge doesn't quite seem to mimic that correctly, and you have to downcast it yourself to pass.

Kyle Baker
Kyle Baker
8,211 Points

Really good explanation, ty