我知道这个问题已经被问过,但他们没有在同样的情况,我在
我的问题,我需要让我的PostPhotosActivity类retainInstance。我做这件事的方法是把它变成一个片段。不幸的是我总是收到此错误。
12-13 14:38:55.669:E / AndroidRuntime(30234):致命异常:主要
12-13 14:38:55.669:E / AndroidRuntime(30234):java.lang.RuntimeException的:无法实例活动ComponentInfo {trade.ly.tradely / trade.ly.tradely.PostPhotosActivity}:java.lang.ClassCastException:贸易.ly.tradely.PostPhotosActivity不能转换为android.app.Activity
12-13 14:38:55.669:E / AndroidRuntime(30234):在android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2106)
12-13 14:38:55.669:E / AndroidRuntime(30234):在android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2230)
12-13 14:38:55.669:E / AndroidRuntime(30234):在android.app.ActivityThread.access $ 600(ActivityThread.java:141)
12-13 14:38:55.669:E / AndroidRuntime(30234):在android.app.ActivityThread $ H.handleMessage(ActivityThread.java:1234)
12-13 14:38:55.669:E / AndroidRuntime(30234):在android.os.Handler.dispatchMessage(Handler.java:99)
12-13 14:38:55.669:E / AndroidRuntime(30234):在android.os.Looper.loop(Looper.java:137)
12-13 14:38:55.669:E / AndroidRuntime(30234):在android.app.ActivityThread.main(ActivityThread.java:5039)
12-13 14:38:55.669:E / AndroidRuntime(30234):在java.lang.reflect.Method.invokeNative(本机方法)
12-13 14:38:55.669:E / AndroidRuntime(30234):在java.lang.reflect.Method.invoke(Method.java:511)
12-13 14:38:55.669:E / AndroidRuntime(30234):在com.android.internal.os.ZygoteInit $ MethodAndArgsCaller.run(ZygoteInit.java:793)
12-13 14:38:55.669:E / AndroidRuntime(30234):在com.android.internal.os.ZygoteInit.main(ZygoteInit.java:560)
12-13 14:38:55.669:E / AndroidRuntime(30234):在dalvik.system.NativeStart.main(本机方法)
12-13 14:38:55.669:E / AndroidRuntime(30234):由:java.lang.ClassCastException:trade.ly.tradely.PostPhotosActivity不能转换为android.app.Activity
12-13 14:38:55.669:E / AndroidRuntime(30234):在android.app.Instrumentation.newActivity(Instrumentation.java:1054)
12-13 14:38:55.669:E / AndroidRuntime(30234):在android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2097)
12-13 14:38:55.669:E / AndroidRuntime(30234):11 ...更多
下面是多数民众赞成让所有的错误PostPhotosActivity。
公共类PostPhotosActivity扩展android.app.Fragment {
公共静态最终字符串变量=PostPhotosActivity;
字符串名称,价格,描述,maincat,subcat,PNAME,pemail,pphone,pmeet,imageUri;
公共静态最后弦乐TEMP_PHOTO_FILE_NAME =temp_photo.jpg;
公共静态最终诠释REQUEST_ code_GALLERY =为0x1;
公共静态最终诠释REQUEST_ code_TAKE_PICTURE = 0X2;
公共静态最终诠释REQUEST_ code_CROP_IMAGE = 0x3中;
私人ImageView的mImageView;
私人文件mFileTemp;
ParseFile文件;
双纬度;
最终的String []项目=新的String [] {从相机拍摄,从库中选择};
双经度;
Button按钮;
@覆盖
公共查看onCreateView(LayoutInflater充气,容器的ViewGroup,
捆绑savedInstanceState){
查看查看= inflater.inflate(R.layout.activity_post_photos,集装箱,假);
捆绑额外= getActivity()getIntent()getExtras()。
如果(临时演员!= NULL)
{
标题= extras.getString(TITLE); //基于密钥获得的价值
价格= extras.getString(代价); //基于密钥获得的价值
说明= extras.getString(说明); //基于密钥获得的价值
maincat = extras.getString(MAINCAT); //基于密钥获得的价值
subcat = extras.getString(SUBCAT); //基于密钥获得的价值
PNAME = extras.getString(PNAME); //基于密钥获得的价值
pemail = extras.getString(PEMAIL); //基于密钥获得的价值
pphone = extras.getString(PPHONE); //基于密钥获得的价值
pmeet = extras.getString(PMEET); //基于密钥获得的价值
纬度= extras.getDouble(纬度);
经度= extras.getDouble(长);
}
按钮newPost =(按钮)view.findViewById(R.id.post_data);
newPost.setVisibility(View.INVISIBLE);
newPost.setOnClickListener(新View.OnClickListener(){
公共无效的onClick(视图v){
//执行上的点击动作
ParseGeoPoint点=新ParseGeoPoint(纬度,经度);
的parseObject setPost =新的parseObject(帖子);
//创建与当前用户的作者的关系
setPost.put(作家,ParseUser.getCurrentUser());
//获取位置
setPost.put(位置,点);
setPost.put(标题,标题);
setPost.put(价格,价格);
setPost.put(描述,说明);
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(照片,文件);
setPost.saveInBackground();
意向意图=新的意图(getActivity(),Flow.class);
startActivity(意向);
}
});
ArrayAdapter<字符串>适配器=新的ArrayAdapter<字符串>(getActivity(),android.R.layout.select_dialog_item,项目);
AlertDialog.Builder建设者=新AlertDialog.Builder(getActivity());
builder.setTitle(选择图片);
builder.setAdapter(适配器,新DialogInterface.OnClickListener(){
公共无效的onClick(DialogInterface对话,诠释项){//挑选
// 相机
如果(项目== 0){
拍照片();
}其他{//挑选文件
openGallery();
}
}
});
最后AlertDialog对话框= builder.create();
mImageView =(ImageView的)view.findViewById(R.id.iv_photo);
mImageView.setOnClickListener(新OnClickListener(){
公共无效的onClick(视图v){
dialog.show();
}
});
字符串状态= Environment.getExternalStorageState();
如果(Environment.MEDIA_MOUNTED.equals(州)){
mFileTemp =新的文件(Environment.getExternalStorageDirectory(),TEMP_PHOTO_FILE_NAME);
}
其他 {
mFileTemp =新的文件(getActivity()getFilesDir(),TEMP_PHOTO_FILE_NAME。);
}
setRetainInstance(真正的);
返回查看;
}
私人无效takePicture(){
意向意图=新的意图(MediaStore.ACTION_IMAGE_CAPTURE);
尝试 {
乌里mImageCaptureUri = NULL;
字符串状态= Environment.getExternalStorageState();
如果(Environment.MEDIA_MOUNTED.equals(州)){
mImageCaptureUri = Uri.fromFile(mFileTemp);
}
其他 {
/ *
*将溶液取自这里: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(回归数据,真正的);
startActivityForResult(意向,REQUEST_ code_TAKE_PICTURE);
}赶上(ActivityNotFoundException E){
Log.d(TAG,不能拍照,E);
}
}
私人无效openGallery(){
意图photoPickerIntent =新的意图(Intent.ACTION_PICK);
photoPickerIntent.setType(图像/ *);
startActivityForResult(photoPickerIntent,REQUEST_ code_GALLERY);
}
私人无效startCropImage(){
意向意图=新的意图(getActivity(),CropImage.class);
intent.putExtra(CropImage.IMAGE_PATH,mFileTemp.getPath());
intent.putExtra(CropImage.SCALE,真正的);
intent.putExtra(CropImage.ASPECT_X,1);
intent.putExtra(CropImage.ASPECT_Y,1);
startActivityForResult(意向,REQUEST_ code_CROP_IMAGE);
}
@覆盖
公共无效onActivityResult(INT申请code,INT结果code,意图数据){
如果(结果code!= Activity.RESULT_OK){
返回;
}
点阵位图;
开关(要求code){
案例REQUEST_ code_GALLERY:
尝试 {
InputStream中的InputStream = getActivity()getContentResolver()openInputStream(data.getData())。;
FileOutputStream中的FileOutputStream =新的FileOutputStream(mFileTemp);
copyStream(InputStream的,FileOutputStream中);
fileOutputStream.close();
inputStream.close();
startCropImage();
}赶上(例外五){
Log.e(TAG,错误而创建的临时文件,E);
}
打破;
案例REQUEST_ code_TAKE_PICTURE:
startCropImage();
打破;
案例REQUEST_ code_CROP_IMAGE:
字符串路径= data.getStringExtra(CropImage.IMAGE_PATH);
如果(路径== NULL){
返回;
}
// byte []的IDATA = path.getBytes();
位图图片= BitmapFactory.de codeFILE(路径);
ByteArrayOutputStream流=新ByteArrayOutputStream();
picture.com preSS(Bitmap.Com pressFormat.JPEG,100,流);
//获取字节数组在这里
byte []的IDATA = stream.toByteArray();
文件=新ParseFile(photo.jpg,IDATA);
file.saveInBackground();
位= BitmapFactory.de codeFILE(mFileTemp.getPath());
mImageView.setImageBitmap(位);
button.setVisibility(View.VISIBLE);
打破;
}
super.onActivityResult(要求code,因此code,数据);
}
公共静态无效copyStream(输入的InputStream,OutputStream的输出)
抛出IOException异常{
byte []的缓冲区=新的字节[1024];
INT读取动作;
而((读取动作= input.read(缓冲液))!= - 1){
output.write(缓冲液,0,读取动作);
}
}
}
清单
<活动
机器人:名称=trade.ly.tradely.PostPhotosActivity
机器人:标签=@字符串/ title_activity_post_photos>
< /活性GT;
的片段正在创建的onClick班级活动
公共类PostActivity扩展FragmentActivity工具
PageFragmentCallbacks,ReviewFragment.Callbacks,ModelCallbacks {
私人ViewPager mPager;
私人MyPagerAdapter mPagerAdapter;
私人布尔mEditingAfterReview;
私人AbstractWizardModel mWizardModel =新SandwichWizardModel(本);
私人布尔mConsumePageSelectedEvent;
私人按钮mNextButton;
私人按钮M prevButton;
字符串用户名;
字符串uemail;
私人名单,其中,第> mCurrentPageSequence;
私人StepPagerStrip mStepPagerStrip;
公共静态最终字符串变量=PostActivity;
双纬度,经度;
公共无效的onCreate(包savedInstanceState){
super.onCreate(savedInstanceState);
的setContentView(R.layout.activity_post);
捆绑额外= getIntent()getExtras()。
如果(临时演员!= NULL){
//获取结果
用户名= extras.getString(姓名);
uemail = extras.getString(电子邮件);
}
捆绑数据=新包();
如果(!TextUtils.isEmpty(CustomerInfoPage.EMAIL_DATA_KEY)){
data.putString(CustomerInfoPage.EMAIL_DATA_KEY,uemail);
mWizardModel.findByKey(您的信息)resetData(数据)。
}
GpsLocationTracker mGpsLocationTracker =新GpsLocationTracker(PostActivity.this);
//设置GPS定位获取地址
如果(mGpsLocationTracker.canGetLocation())
{
纬度= mGpsLocationTracker.getLatitude();
经度= mGpsLocationTracker.getLongitude();
Log.i(TAG,的String.Format(纬度:%S,纬度));
Log.i(TAG,的String.Format(经度:%S,经度));
}
其他
{
mGpsLocationTracker.showSettingsAlert();
}
如果(savedInstanceState!= NULL){
mWizardModel.load(savedInstanceState.getBundle(模型));
}
mWizardModel.registerListener(本);
mPagerAdapter =新MyPagerAdapter(getSupportFragmentManager());
mPager =(ViewPager)findViewById(R.id.pager);
mPager.setAdapter(mPagerAdapter);
mStepPagerStrip =(StepPagerStrip)findViewById(R.id.strip);
mStepPagerStrip.setOnPageSelectedListener(新StepPagerStrip.OnPageSelectedListener(){
@覆盖
公共无效onPageStripSelected(INT位置){
位置= Math.min(mPagerAdapter.getCount() - 1,位置);
如果(mPager.getCurrentItem()!=位置){
mPager.setCurrentItem(位置);
}
}
});
mNextButton =(按钮)findViewById(R.id.next_button);
米prevButton =(按钮)findViewById(R.id. prev_button);
mPager.setOnPageChangeListener(新ViewPager.SimpleOnPageChangeListener(){
@覆盖
公共无效onPageSelected(INT位置){
mStepPagerStrip.setCurrentPage(位置);
如果(mConsumePageSelectedEvent){
mConsumePageSelectedEvent = FALSE;
返回;
}
mEditingAfterReview = FALSE;
updateBottomBar();
}
});
mNextButton.setOnClickListener(新View.OnClickListener(){
@燮pressLint(ValidFragment)
@覆盖
公共无效的onClick(视图查看){
如果(mPager.getCurrentItem()== mCurrentPageSequence.size()){
DialogFragment DG =新DialogFragment(){
@覆盖
公共对话onCreateDialog(包savedInstanceState){
返回新AlertDialog.Builder(getActivity())
.setMessage(R.string.submit_confirm_message)
.setPositiveButton(
R.string.submit_confirm_button,
新DialogInterface.OnClickListener(){
公共无效的onClick(
DialogInterface对话框,
INT编号){
字符串标题= mWizardModel
.findByKey(
邮报信息)
.getData()
.getString(
TpdModel.TITLE_DATA_KEY);
串价格= mWizardModel
.findByKey(
邮报信息)
.getData()
.getString(
TpdModel.PRICE_DATA_KEY);
字符串描述= mWizardModel
.findByKey(
邮报信息)
.getData()
.getString(
TpdModel.DESCRIPTION_DATA_KEY);
字符串maincat = mWizardModel
.findByKey(
主目录)
.getData()
.getString(
Page.SIMPLE_DATA_KEY);
字符串subcat = mWizardModel
.findByKey(
子类别)
.getData()
.getString(
Page.SIMPLE_DATA_KEY);
字符串PNAME = mWizardModel
.findByKey(
您的信息)
.getData()
.getString(
CustomerInfoPage.NAME_DATA_KEY);
字符串pemail = mWizardModel
.findByKey(
您的信息)
.getData()
.getString(
CustomerInfoPage.EMAIL_DATA_KEY);
字符串pphone = mWizardModel
.findByKey(
您的信息)
.getData()
.getString(
CustomerInfoPage.PHONE_DATA_KEY);
字符串pmeet = mWizardModel
.findByKey(
您的信息)
.getData()
.getString(
CustomerInfoPage.MEET_DATA_KEY);
意图I =新的意图(
PostActivity.this,
PostPhotosActivity.class);
i.putExtra(标题,标题);
i.putExtra(价格,价格);
i.putExtra(说明,
描述);
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(土地增值税,纬度);
i.putExtra(长,经度);
startActivityForResult(ⅰ,0);
}
})
.setNegativeButton(android.R.string.cancel,
空).create();
}
};
dg.show(getSupportFragmentManager(),place_order_dialog);
} 其他 {
如果(mEditingAfterReview){
mPager.setCurrentItem(mPagerAdapter.getCount() - 1);
} 其他 {
mPager.setCurrentItem(mPager.getCurrentItem()+ 1);
}
}
}
});
米prevButton.setOnClickListener(新View.OnClickListener(){
@覆盖
公共无效的onClick(视图查看){
mPager.setCurrentItem(mPager.getCurrentItem() - 1);
}
});
onPageTreeChanged();
updateBottomBar();
}
@覆盖
公共无效onPageTreeChanged(){
mCurrentPageSequence = mWizardModel.getCurrentPageSequence();
recalculateCutOffPage();
mStepPagerStrip.setPageCount(mCurrentPageSequence.size()+ 1); // + 1 =
// 评论
// 步骤
mPagerAdapter.notifyDataSetChanged();
updateBottomBar();
}
私人无效updateBottomBar(){
INT位置= mPager.getCurrentItem();
如果(位置== mCurrentPageSequence.size()){
mNextButton.setText(R.string.finish);
mNextButton.setBackgroundResource(R.drawable.finish_background);
mNextButton.setTextAppearance(这一点,R.style.TextAppearanceFinish);
} 其他 {
mNextButton.setText(mEditingAfterReview?R.string.review
:R.string.next);
mNextButton
.setBackgroundResource(R.drawable.selectable_item_background);
的TypedValue V =新的TypedValue();
getTheme()。resolveAttribute(android.R.attr.textAppearanceMedium,V,
真正);
mNextButton.setTextAppearance(这一点,v.resourceId);
mNextButton.setEnabled(位置= mPagerAdapter.getCutOffPage()!);
}
米prevButton
.setVisibility(位置< = 0 View.INVISIBLE:View.VISIBLE);
}
@覆盖
保护无效的onDestroy(){
super.onDestroy();
mWizardModel.unregisterListener(本);
}
@覆盖
保护无效的onSaveInstanceState(包outState){
super.onSaveInstanceState(outState);
outState.putBundle(模式,mWizardModel.save());
}
@覆盖
公共AbstractWizardModel onGetModel(){
返回mWizardModel;
}
@覆盖
公共无效onEditScreenAfterReview(字符串键){
的for(int i = mCurrentPageSequence.size() - 1; I> = 0;我 - ){
如果(mCurrentPageSequence.get(我).getKey()。等于(键)){
mConsumePageSelectedEvent =真;
mEditingAfterReview = TRUE;
mPager.setCurrentItem(ⅰ);
updateBottomBar();
打破;
}
}
}
@覆盖
公共无效onPageDataChanged(页){
如果(page.isRequired()){
如果(recalculateCutOffPage()){
mPagerAdapter.notifyDataSetChanged();
updateBottomBar();
}
}
}
@覆盖
公共页面onGetPage(字符串键){
返回mWizardModel.findByKey(键);
}
私人布尔recalculateCutOffPage(){
//切断寻呼机适配器在未完成第一页所需
INT cutOffPage = mCurrentPageSequence.size()+ 1;
的for(int i = 0; I< mCurrentPageSequence.size();我++){
页= mCurrentPageSequence.get(我);
如果(page.isRequired()&安培;&安培;!page.isCompleted()){
cutOffPage =我;
打破;
}
}
如果(mPagerAdapter.getCutOffPage()!= cutOffPage){
mPagerAdapter.setCutOffPage(cutOffPage);
返回true;
}
返回false;
}
公共类MyPagerAdapter扩展FragmentStatePagerAdapter {
私人诠释mCutOffPage;
私人片段mPrimaryItem;
公共MyPagerAdapter(FragmentManager FM){
超(FM);
}
@覆盖
公共片段的getItem(int i)以{
如果(ⅰ> = mCurrentPageSequence.size()){
返回新ReviewFragment();
}
返回mCurrentPageSequence.get(ⅰ).createFragment();
}
@覆盖
公众诠释getItemPosition(Object对象){
// TODO:更聪明这个
如果(对象== mPrimaryItem){
//重新使用当前片段(其位置不会改变)
返回POSITION_UNCHANGED;
}
返回POSITION_NONE;
}
@覆盖
公共无效setPrimaryItem(ViewGroup中的容器,INT位置,
Object对象){
super.setPrimaryItem(集装箱,位置,对象);
mPrimaryItem =(片段)的对象;
}
@覆盖
公众诠释getCount将(){
返回Math.min(mCutOffPage + 1,mCurrentPageSequence == NULL?1
:mCurrentPageSequence.size()+ 1);
}
公共无效setCutOffPage(INT cutOffPage){
如果(cutOffPage℃,){
cutOffPage = Integer.MAX_VALUE的;
}
mCutOffPage = cutOffPage;
}
公众诠释getCutOffPage(){
返回mCutOffPage;
}
}
}
解决方案
您无法使用 PostPhotosActivity
的活动,因为它不是一项活动。它是碎片,因为它扩展片段
不是活动
。有了这个在你的清单是对意图的错误,并呼吁startActivityForResult
意向书我=新的意图(
PostActivity.this,
PostPhotosActivity.class);
导致异常铸造,因为片段
只是不能被强制转换为活动
。
您可以使用XML布局与此片段在其他一些活动或改变片段的活性。 XML的布局为例:
< LinearLayout中的xmlns:机器人=http://schemas.android.com/apk/res/android
机器人:方向=横向
机器人:layout_width =match_parent机器人:layout_height =match_parent>
<片段类=com.example.PostPhotosFragment
机器人:ID =@ + ID / post_photos_fragment
机器人:layout_width =match_parent机器人:layout_height =match_parent/>
< / LinearLayout中>
,然后在一些活动延伸活动
高级应召的setContentView(R.layout.yourlayout)
和你的片段将您的活动创建。
I know this question has been asked before but they haven't been in the same situation I'm in.
My problem I need to have my PostPhotosActivity class retainInstance. The way I'm doing that is turning it into a fragment. Unfortunately I'm always getting this 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
Here is the PostPhotosActivity that's making all the errors.
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>
Class Activity where the fragment is being created 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;
}
}
}
解决方案
You cannot use PostPhotosActivity
as activity because it is not an activity. It is fragment because it extends Fragment
not Activity
. Having this in your manifest is a mistake and calling startActivityForResult on intent
Intent i = new Intent(
PostActivity.this,
PostPhotosActivity.class);
causes the exception in casting because Fragment
just cannot be casted to Activity
.
You could use xml layout with this fragment in some other activity or change the fragment to activity. Example of xml layout:
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:orientation="horizontal"
android:layout_width="match_parent" android:layout_height="match_parent">
<fragment class="com.example.PostPhotosFragment"
android:id="@+id/post_photos_fragment"
android:layout_width="match_parent" android:layout_height="match_parent" />
</LinearLayout>
and then in some activity which extends Activity
class call setContentView(R.layout.yourlayout)
and your fragment will be created in your activity.