基本上,我按一个按钮,这会通过使用相机意图打开您的默认相机应用程序。拍摄照片后,它会保存所需的内容并重定向到另一个活动。
在本次活动中,我有一个可以成功上传图片的AsyncTask。那么你可能会问我的问题是什么。我的问题是它重新创建了我的活动,因此重置了我的ProgressDialog。 (它运行活动,aSyncTask是否会在它完成之前消失并重新创建我的Activity以再次执行asynctask。)
并不总是如此。我认为这样做是因为它改变了手机的方向,从风景到肖像。 (我有一个三星。当我去相机时,它会改变为风景,当我完成它时,它会回到肖像。)
我已完成作业并将这些内容添加到我的清单中:
android:configChanges="orientation|keyboardHidden"
android:screenOrientation="portrait" >
我确保以纵向方式“锁定”我的应用,但我仍然看到我的应用更改了方向,我相信这就是我的活动重新创建的原因。
我计划添加各种检查,但我认为这不是处理这种情况的正确方法,因为它有时不会重新创建活动。
我所说的支票是使用:
protected void onSaveInstanceState(Bundle outState) {
outState.putString("started", "1");
}
无论如何,有人可以帮帮我吗?我只是想让它加载活动而不会让我自我毁灭。
PS:VM没有任何问题。 VM加载活动并完成它而不重新创建它。
PPS:在我的三星上进行了额外的测试,如果我将它保持在横向模式下它会起作用。因此,相机正在摧毁我的活动,因为它会改变方向。答案 0 :(得分:9)
我有同样的问题,结果你还需要监听API等级13或更高的屏幕尺寸变化,如此处所述; https://stackoverflow.com/a/11483806
android:configChanges="orientation|screenSize"
答案 1 :(得分:1)
为了解决这个问题,我必须在清单文件中使用以下内容:
android:screenOrientation="portrait"
android:launchMode="singleTop"
android:configChanges="keyboardHidden|orientation|screenSize"
答案 2 :(得分:0)
尝试创建片段活动以处理显示和更新进度对话框
在片段活动中确保并设置“setRetainInstance(true);”这将确保在创建/销毁主活动时不会销毁它。
将整个图像捕获过程放在此片段中可能是个好主意,包括asynctask。确保不从AsyncTask中的doInBackground()中引用父活动的上下文。如果你这样做并且方向改变(即活动被破坏),它将引发错误。
这是一个粗略的例子:
public class MyFragment extends FragmentActivity {
private ProgressBar mProgressBar;
private boolean mAsyncTaskActive = false;
@Override
public void onActivityCreated(Bundle savedInstanceState) {
super.onActivityCreated(savedInstanceState);
setRetainInstance(true);
// grab reference to progress bar
mProgressBar = (ProgressBar) getActivity().findViewById(R.id.my_progress_bar);
// check to see if the async task is active and set the progress bar visibility accordingly
if (mAsyncTaskActive) {
mProgressBar.setVisibility(View.VISIBLE);
mProgressBarText.setVisibility(View.VISIBLE);
}
}
// this method is called from your main activity when the user does something (i.e. clicks a button)
// make sure you have already instantiated the fragment
public void startSomething() {
if (mAsyncTaskActive == false) {
mProgressBar.setVisibility(View.VISIBLE);
new MyAsyncTask().execute();
mAsyncTaskActive = true;
}
}
private class MyAsyncTask extends AsyncTask<Void, Void, Void> {
Context applicationContext;
@Override
protected Void doInBackground(String... params) {
// do stuff
publishProgress(//some number);
return null;
}
@Override
protected void onProgressUpdate(Integer... progress) {
setProgressPercent(progress[0]);
}
}
如果您还不熟悉,还应该看一下如何实现片段。 Android开发博客在DialogFragments上有一个很好的帖子,同样的原则。 http://android-developers.blogspot.com/2012/05/using-dialogfragments.html