Welcome to the Treehouse Community
Want to collaborate on code errors? Have bugs you need feedback on? Looking for an extra set of eyes on your latest project? Get support with fellow developers, designers, and programmers of all backgrounds and skill levels here with the Treehouse Community! While you're at it, check out some resources Treehouse students have shared here.
Looking to learn something new?
Treehouse offers a seven day free trial for new students. Get access to thousands of hours of content and join thousands of Treehouse students and alumni in the community today.
Start your free trialKyle Baker
8,211 Pointsconfused
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
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);
}
});
}
}
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");
}
}
Kyle Baker
8,211 PointsOh I didn't even think to cast it. Thanks friend :)
1 Answer
Seth Kroger
56,414 PointsgetParcelableExtra() 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
8,211 PointsReally good explanation, ty
Tyler Vanderley
20,491 PointsTyler Vanderley
20,491 PointsSo, 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.