Fragment kann nicht gewirkt werden, um android.app.Aktivität
Ich weiß, diese Frage wurde vorhin gefragt, aber Sie wurden nicht in der gleichen situation bin ich in.
Mein problem ich muss meine PostPhotosActivity Klasse retainInstance. Die Art, wie ich bin, das zu tun, verwandelte Sie in ein fragment. Leider bin ich immer diese Fehlermeldung bekommen.
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
Hier ist die PostPhotosActivity machen alle Fehler.
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);
}
}
}
Manifest
<activity
android:name="trade.ly.tradely.PostPhotosActivity"
android:label="@string/title_activity_post_photos">
</activity>
Klasse Aktivität wo das fragment erstellt wird 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;
}
}
}
- Poste bitte den gesamten StackTrace.
- Bitte poste Schnitt von code, wenn Sie erstellen oder verwenden Sie Ihre PostPhotosActivity Klasse (manifest oder irgendwo im code). Fragment ist nicht eine Tätigkeit, eine, die ich denke, Sie zu benutzen versuchen, dieses fragment irgendwo, wo Aktivität erforderlich ist.
- Bitte überprüfen Sie die edit!
Du musst angemeldet sein, um einen Kommentar abzugeben.
Können Sie nicht verwenden
PostPhotosActivity
als Aktivität, denn es ist keine Tätigkeit. Es ist fragment, weil es erstreckt sichFragment
nichtActivity
. Nachdem diese in Ihrem manifest ist ein Fehler, der Aufruf von startActivityForResult, die auf Vorsatzbewirkt, dass die Ausnahme im casting, weil
Fragment
einfach nicht mehr gegossen werden, umActivity
.Könnten Sie xml-layout mit diesem fragment in einer anderen Aktivität oder ändern Sie die fragment-Aktivität. Beispiel der xml-layout:
und dann bei irgendeiner Tätigkeit erstreckt
Activity
Klasse aufrufensetContentView(R.layout.yourlayout)
und Ihr fragment erstellt werden in Ihrer Aktivität.