El fragmento no se puede lanzar a android.app.activity
Sé que esta pregunta se ha hecho antes, pero no han estado en la misma situación en la que estoy.
Mi problema necesito tener mi clase PostPhotosActivity retenida. La forma en que lo estoy haciendo es convertirlo en un fragmento. Lamentablemente siempre estoy recibiendo este error.
12-13 14:38:55.669: E/AndroidRuntime(30234): FATAL EXCEPTION: main
12-13 14:38:55.669: E/AndroidRuntime(30234): java.lang.RuntimeException: Unable to instantiate activity ComponentInfo{trade.ly.tradely/trade.ly.tradely.PostPhotosActivity}: java.lang.ClassCastException: trade.ly.tradely.PostPhotosActivity cannot be cast to android.app.Activity
12-13 14:38:55.669: E/AndroidRuntime(30234): at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2106)
12-13 14:38:55.669: E/AndroidRuntime(30234): at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2230)
12-13 14:38:55.669: E/AndroidRuntime(30234): at android.app.ActivityThread.access$600(ActivityThread.java:141)
12-13 14:38:55.669: E/AndroidRuntime(30234): at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1234)
12-13 14:38:55.669: E/AndroidRuntime(30234): at android.os.Handler.dispatchMessage(Handler.java:99)
12-13 14:38:55.669: E/AndroidRuntime(30234): at android.os.Looper.loop(Looper.java:137)
12-13 14:38:55.669: E/AndroidRuntime(30234): at android.app.ActivityThread.main(ActivityThread.java:5039)
12-13 14:38:55.669: E/AndroidRuntime(30234): at java.lang.reflect.Method.invokeNative(Native Method)
12-13 14:38:55.669: E/AndroidRuntime(30234): at java.lang.reflect.Method.invoke(Method.java:511)
12-13 14:38:55.669: E/AndroidRuntime(30234): at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:793)
12-13 14:38:55.669: E/AndroidRuntime(30234): at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:560)
12-13 14:38:55.669: E/AndroidRuntime(30234): at dalvik.system.NativeStart.main(Native Method)
12-13 14:38:55.669: E/AndroidRuntime(30234): Caused by: java.lang.ClassCastException: trade.ly.tradely.PostPhotosActivity cannot be cast to android.app.Activity
12-13 14:38:55.669: E/AndroidRuntime(30234): at android.app.Instrumentation.newActivity(Instrumentation.java:1054)
12-13 14:38:55.669: E/AndroidRuntime(30234): at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2097)
12-13 14:38:55.669: E/AndroidRuntime(30234): ... 11 more
Aquí está la actividad PostPhotos que está cometiendo todos los errores.
public class PostPhotosActivity extends android.app.Fragment {
public static final String TAG = "PostPhotosActivity";
String title, price, description, maincat, subcat, pname, pemail, pphone, pmeet, imageUri;
public static final String TEMP_PHOTO_FILE_NAME = "temp_photo.jpg";
public static final int REQUEST_CODE_GALLERY = 0x1;
public static final int REQUEST_CODE_TAKE_PICTURE = 0x2;
public static final int REQUEST_CODE_CROP_IMAGE = 0x3;
private ImageView mImageView;
private File mFileTemp;
ParseFile file;
double latitude;
final String[] items = new String[] { "Take from camera", "Select from gallery" };
double longitude;
Button button;
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) {
View view = inflater.inflate(R.layout.activity_post_photos, container,false);
Bundle extras= getActivity().getIntent().getExtras();
if(extras!=null)
{
title = extras.getString("TITLE"); // get the value based on the key
price = extras.getString("PRICE"); // get the value based on the key
description = extras.getString("DESCRIPTION"); // get the value based on the key
maincat = extras.getString("MAINCAT"); // get the value based on the key
subcat = extras.getString("SUBCAT"); // get the value based on the key
pname = extras.getString("PNAME"); // get the value based on the key
pemail = extras.getString("PEMAIL"); // get the value based on the key
pphone = extras.getString("PPHONE"); // get the value based on the key
pmeet = extras.getString("PMEET"); // get the value based on the key
latitude = extras.getDouble("lat");
longitude = extras.getDouble("long");
}
Button newPost = (Button)view.findViewById(R.id.post_data);
newPost.setVisibility(View.INVISIBLE);
newPost.setOnClickListener(new View.OnClickListener() {
public void onClick(View v) {
// Perform action on click
ParseGeoPoint point = new ParseGeoPoint(latitude, longitude);
ParseObject setPost = new ParseObject("Posts");
// Create an author relationship with the current user
setPost.put("author", ParseUser.getCurrentUser());
// Get location
setPost.put("location", point);
setPost.put("Title", title);
setPost.put("Price", price);
setPost.put("Description", description);
setPost.put("MainCat", maincat);
setPost.put("SubCat", subcat);
setPost.put("PName", pname);
setPost.put("PEmail", pemail);
setPost.put("PPhone", pphone);
setPost.put("PMeet", pmeet);
setPost.put("Photo", file);
setPost.saveInBackground();
Intent intent = new Intent(getActivity(), Flow.class);
startActivity(intent);
}
});
ArrayAdapter<String> adapter = new ArrayAdapter<String>(getActivity(), android.R.layout.select_dialog_item, items);
AlertDialog.Builder builder = new AlertDialog.Builder(getActivity());
builder.setTitle("Select Image");
builder.setAdapter(adapter, new DialogInterface.OnClickListener() {
public void onClick(DialogInterface dialog, int item) { // pick from
// camera
if (item == 0) {
takePicture();
} else { // pick from file
openGallery();
}
}
});
final AlertDialog dialog = builder.create();
mImageView = (ImageView) view.findViewById(R.id.iv_photo);
mImageView.setOnClickListener(new OnClickListener() {
public void onClick(View v) {
dialog.show();
}
});
String state = Environment.getExternalStorageState();
if (Environment.MEDIA_MOUNTED.equals(state)) {
mFileTemp = new File(Environment.getExternalStorageDirectory(), TEMP_PHOTO_FILE_NAME);
}
else {
mFileTemp = new File(getActivity().getFilesDir(), TEMP_PHOTO_FILE_NAME);
}
setRetainInstance(true);
return view;
}
private void takePicture() {
Intent intent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);
try {
Uri mImageCaptureUri = null;
String state = Environment.getExternalStorageState();
if (Environment.MEDIA_MOUNTED.equals(state)) {
mImageCaptureUri = Uri.fromFile(mFileTemp);
}
else {
/*
* The solution is taken from here: http://stackoverflow.com/questions/10042695/how-to-get-camera-result-as-a-uri-in-data-folder
*/
mImageCaptureUri = InternalStorageContentProvider.CONTENT_URI;
}
intent.putExtra(android.provider.MediaStore.EXTRA_OUTPUT, mImageCaptureUri);
intent.putExtra("return-data", true);
startActivityForResult(intent, REQUEST_CODE_TAKE_PICTURE);
} catch (ActivityNotFoundException e) {
Log.d(TAG, "cannot take picture", e);
}
}
private void openGallery() {
Intent photoPickerIntent = new Intent(Intent.ACTION_PICK);
photoPickerIntent.setType("image/*");
startActivityForResult(photoPickerIntent, REQUEST_CODE_GALLERY);
}
private void startCropImage() {
Intent intent = new Intent(getActivity(), CropImage.class);
intent.putExtra(CropImage.IMAGE_PATH, mFileTemp.getPath());
intent.putExtra(CropImage.SCALE, true);
intent.putExtra(CropImage.ASPECT_X, 1);
intent.putExtra(CropImage.ASPECT_Y, 1);
startActivityForResult(intent, REQUEST_CODE_CROP_IMAGE);
}
@Override
public void onActivityResult(int requestCode, int resultCode, Intent data) {
if (resultCode != Activity.RESULT_OK) {
return;
}
Bitmap bitmap;
switch (requestCode) {
case REQUEST_CODE_GALLERY:
try {
InputStream inputStream = getActivity().getContentResolver().openInputStream(data.getData());
FileOutputStream fileOutputStream = new FileOutputStream(mFileTemp);
copyStream(inputStream, fileOutputStream);
fileOutputStream.close();
inputStream.close();
startCropImage();
} catch (Exception e) {
Log.e(TAG, "Error while creating temp file", e);
}
break;
case REQUEST_CODE_TAKE_PICTURE:
startCropImage();
break;
case REQUEST_CODE_CROP_IMAGE:
String path = data.getStringExtra(CropImage.IMAGE_PATH);
if (path == null) {
return;
}
//byte[] idata = path.getBytes();
Bitmap picture = BitmapFactory.decodeFile(path);
ByteArrayOutputStream stream = new ByteArrayOutputStream();
picture.compress(Bitmap.CompressFormat.JPEG, 100, stream);
// get byte array here
byte[] idata= stream.toByteArray();
file = new ParseFile("photo.jpg", idata);
file.saveInBackground();
bitmap = BitmapFactory.decodeFile(mFileTemp.getPath());
mImageView.setImageBitmap(bitmap);
button.setVisibility(View.VISIBLE);
break;
}
super.onActivityResult(requestCode, resultCode, data);
}
public static void copyStream(InputStream input, OutputStream output)
throws IOException {
byte[] buffer = new byte[1024];
int bytesRead;
while ((bytesRead = input.read(buffer)) != -1) {
output.write(buffer, 0, bytesRead);
}
}
}
Manifiesto
<activity
android:name="trade.ly.tradely.PostPhotosActivity"
android:label="@string/title_activity_post_photos">
</activity>
Actividad de clase en la que se crea el fragmento onClick
public class PostActivity extends FragmentActivity implements
PageFragmentCallbacks, ReviewFragment.Callbacks, ModelCallbacks {
private ViewPager mPager;
private MyPagerAdapter mPagerAdapter;
private boolean mEditingAfterReview;
private AbstractWizardModel mWizardModel = new SandwichWizardModel(this);
private boolean mConsumePageSelectedEvent;
private Button mNextButton;
private Button mPrevButton;
String user_name;
String uemail;
private List<Page> mCurrentPageSequence;
private StepPagerStrip mStepPagerStrip;
public static final String TAG = "PostActivity";
double latitude, longitude;
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_post);
Bundle extras = getIntent().getExtras();
if(extras !=null) {
// Get the results
user_name = extras.getString("name");
uemail = extras.getString("email");
}
Bundle data = new Bundle();
if (!TextUtils.isEmpty(CustomerInfoPage.EMAIL_DATA_KEY)) {
data.putString(CustomerInfoPage.EMAIL_DATA_KEY, uemail);
mWizardModel.findByKey("Your Info").resetData(data);
}
GpsLocationTracker mGpsLocationTracker = new GpsLocationTracker(PostActivity.this);
// Set GPS Location fetched address
if (mGpsLocationTracker.canGetLocation())
{
latitude = mGpsLocationTracker.getLatitude();
longitude = mGpsLocationTracker.getLongitude();
Log.i(TAG, String.format("latitude: %s", latitude));
Log.i(TAG, String.format("longitude: %s", longitude));
}
else
{
mGpsLocationTracker.showSettingsAlert();
}
if (savedInstanceState != null) {
mWizardModel.load(savedInstanceState.getBundle("model"));
}
mWizardModel.registerListener(this);
mPagerAdapter = new MyPagerAdapter(getSupportFragmentManager());
mPager = (ViewPager) findViewById(R.id.pager);
mPager.setAdapter(mPagerAdapter);
mStepPagerStrip = (StepPagerStrip) findViewById(R.id.strip);
mStepPagerStrip.setOnPageSelectedListener(new StepPagerStrip.OnPageSelectedListener() {
@Override
public void onPageStripSelected(int position) {
position = Math.min(mPagerAdapter.getCount() - 1, position);
if (mPager.getCurrentItem() != position) {
mPager.setCurrentItem(position);
}
}
});
mNextButton = (Button) findViewById(R.id.next_button);
mPrevButton = (Button) findViewById(R.id.prev_button);
mPager.setOnPageChangeListener(new ViewPager.SimpleOnPageChangeListener() {
@Override
public void onPageSelected(int position) {
mStepPagerStrip.setCurrentPage(position);
if (mConsumePageSelectedEvent) {
mConsumePageSelectedEvent = false;
return;
}
mEditingAfterReview = false;
updateBottomBar();
}
});
mNextButton.setOnClickListener(new View.OnClickListener() {
@SuppressLint("ValidFragment")
@Override
public void onClick(View view) {
if (mPager.getCurrentItem() == mCurrentPageSequence.size()) {
DialogFragment dg = new DialogFragment() {
@Override
public Dialog onCreateDialog(Bundle savedInstanceState) {
return new AlertDialog.Builder(getActivity())
.setMessage(R.string.submit_confirm_message)
.setPositiveButton(
R.string.submit_confirm_button,
new DialogInterface.OnClickListener() {
public void onClick(
DialogInterface dialog,
int id) {
String title = mWizardModel
.findByKey(
"Post Info")
.getData()
.getString(
TpdModel.TITLE_DATA_KEY);
String price = mWizardModel
.findByKey(
"Post Info")
.getData()
.getString(
TpdModel.PRICE_DATA_KEY);
String description = mWizardModel
.findByKey(
"Post Info")
.getData()
.getString(
TpdModel.DESCRIPTION_DATA_KEY);
String maincat = mWizardModel
.findByKey(
"Main Category")
.getData()
.getString(
Page.SIMPLE_DATA_KEY);
String subcat = mWizardModel
.findByKey(
"Sub Category")
.getData()
.getString(
Page.SIMPLE_DATA_KEY);
String pname = mWizardModel
.findByKey(
"Your Info")
.getData()
.getString(
CustomerInfoPage.NAME_DATA_KEY);
String pemail = mWizardModel
.findByKey(
"Your Info")
.getData()
.getString(
CustomerInfoPage.EMAIL_DATA_KEY);
String pphone = mWizardModel
.findByKey(
"Your Info")
.getData()
.getString(
CustomerInfoPage.PHONE_DATA_KEY);
String pmeet = mWizardModel
.findByKey(
"Your Info")
.getData()
.getString(
CustomerInfoPage.MEET_DATA_KEY);
Intent i = new Intent(
PostActivity.this,
PostPhotosActivity.class);
i.putExtra("TITLE", title);
i.putExtra("PRICE", price);
i.putExtra("DESCRIPTION",
description);
i.putExtra("MAINCAT",
maincat);
i.putExtra("SUBCAT", subcat);
i.putExtra("PNAME", pname);
i.putExtra("PEMAIL", pemail);
i.putExtra("PPHONE", pphone);
i.putExtra("PMEET", pmeet);
i.putExtra("lat", latitude);
i.putExtra("long", longitude);
startActivityForResult(i, 0);
}
})
.setNegativeButton(android.R.string.cancel,
null).create();
}
};
dg.show(getSupportFragmentManager(), "place_order_dialog");
} else {
if (mEditingAfterReview) {
mPager.setCurrentItem(mPagerAdapter.getCount() - 1);
} else {
mPager.setCurrentItem(mPager.getCurrentItem() + 1);
}
}
}
});
mPrevButton.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
mPager.setCurrentItem(mPager.getCurrentItem() - 1);
}
});
onPageTreeChanged();
updateBottomBar();
}
@Override
public void onPageTreeChanged() {
mCurrentPageSequence = mWizardModel.getCurrentPageSequence();
recalculateCutOffPage();
mStepPagerStrip.setPageCount(mCurrentPageSequence.size() + 1); // + 1 =
// review
// step
mPagerAdapter.notifyDataSetChanged();
updateBottomBar();
}
private void updateBottomBar() {
int position = mPager.getCurrentItem();
if (position == mCurrentPageSequence.size()) {
mNextButton.setText(R.string.finish);
mNextButton.setBackgroundResource(R.drawable.finish_background);
mNextButton.setTextAppearance(this, R.style.TextAppearanceFinish);
} else {
mNextButton.setText(mEditingAfterReview ? R.string.review
: R.string.next);
mNextButton
.setBackgroundResource(R.drawable.selectable_item_background);
TypedValue v = new TypedValue();
getTheme().resolveAttribute(android.R.attr.textAppearanceMedium, v,
true);
mNextButton.setTextAppearance(this, v.resourceId);
mNextButton.setEnabled(position != mPagerAdapter.getCutOffPage());
}
mPrevButton
.setVisibility(position <= 0 ? View.INVISIBLE : View.VISIBLE);
}
@Override
protected void onDestroy() {
super.onDestroy();
mWizardModel.unregisterListener(this);
}
@Override
protected void onSaveInstanceState(Bundle outState) {
super.onSaveInstanceState(outState);
outState.putBundle("model", mWizardModel.save());
}
@Override
public AbstractWizardModel onGetModel() {
return mWizardModel;
}
@Override
public void onEditScreenAfterReview(String key) {
for (int i = mCurrentPageSequence.size() - 1; i >= 0; i--) {
if (mCurrentPageSequence.get(i).getKey().equals(key)) {
mConsumePageSelectedEvent = true;
mEditingAfterReview = true;
mPager.setCurrentItem(i);
updateBottomBar();
break;
}
}
}
@Override
public void onPageDataChanged(Page page) {
if (page.isRequired()) {
if (recalculateCutOffPage()) {
mPagerAdapter.notifyDataSetChanged();
updateBottomBar();
}
}
}
@Override
public Page onGetPage(String key) {
return mWizardModel.findByKey(key);
}
private boolean recalculateCutOffPage() {
// Cut off the pager adapter at first required page that isn't completed
int cutOffPage = mCurrentPageSequence.size() + 1;
for (int i = 0; i < mCurrentPageSequence.size(); i++) {
Page page = mCurrentPageSequence.get(i);
if (page.isRequired() && !page.isCompleted()) {
cutOffPage = i;
break;
}
}
if (mPagerAdapter.getCutOffPage() != cutOffPage) {
mPagerAdapter.setCutOffPage(cutOffPage);
return true;
}
return false;
}
public class MyPagerAdapter extends FragmentStatePagerAdapter {
private int mCutOffPage;
private Fragment mPrimaryItem;
public MyPagerAdapter(FragmentManager fm) {
super(fm);
}
@Override
public Fragment getItem(int i) {
if (i >= mCurrentPageSequence.size()) {
return new ReviewFragment();
}
return mCurrentPageSequence.get(i).createFragment();
}
@Override
public int getItemPosition(Object object) {
// TODO: be smarter about this
if (object == mPrimaryItem) {
// Re-use the current fragment (its position never changes)
return POSITION_UNCHANGED;
}
return POSITION_NONE;
}
@Override
public void setPrimaryItem(ViewGroup container, int position,
Object object) {
super.setPrimaryItem(container, position, object);
mPrimaryItem = (Fragment) object;
}
@Override
public int getCount() {
return Math.min(mCutOffPage + 1, mCurrentPageSequence == null ? 1
: mCurrentPageSequence.size() + 1);
}
public void setCutOffPage(int cutOffPage) {
if (cutOffPage < 0) {
cutOffPage = Integer.MAX_VALUE;
}
mCutOffPage = cutOffPage;
}
public int getCutOffPage() {
return mCutOffPage;
}
}
}