5

基本上,我按下一个按钮,这会通过使用相机意图打开您的默认相机应用程序。拍照后,它将保存所需的东西并重定向到另一个活动。

在这个活动中,我有一个可以成功上传图片的AsyncTask。所以你可能会问我的问题是什么。我的问题是它重新创建了我的活动,因此与它一起重置了我的 ProgressDialog。(它运行活动,执行 aSyncTask,在它完成之前死掉并重新创建我的 Activity 以再次执行 asynctask。)

它并不总是这样做。我认为这样做是因为它将手机的方向从横向更改为纵向。(我有一个三星。当我去相机时,它会变成横向,当我完成时,它又会变成纵向。)

我已经完成了我的作业并将这些东西添加到我的清单中:

android:configChanges="orientation|keyboardHidden"
android:screenOrientation="portrait" >

我已确保将我的应用程序“锁定”为纵向,但我仍然看到我的应用程序更改了方向,我相信这就是我的活动被重新创建的原因。

我计划添加各种检查,但我认为这不是处理这种情况的正确方法,因为它有时不会重新创建活动。

我正在谈论的检查是使用:

protected void onSaveInstanceState(Bundle outState) {
    outState.putString("started", "1");
}

无论如何,有人可以帮助我吗?我只希望它加载活动而不会对我造成自毁。

PS:虚拟机没有任何问题。VM 加载活动并完成它而不重新创建它。

PPS:在我的三星上进行了额外的测试,如果我将它保持在横向模式,它就会工作。因此,绝对是相机通过改变方向破坏了我的活动。

4

3 回答 3

9

我遇到了同样的问题,结果你还需要在 API 级别 13 或更高级别监听屏幕大小的变化,如此处所述;https://stackoverflow.com/a/11483806

android:configChanges="orientation|screenSize"
于 2012-11-22T10:56:40.550 回答
2

为了解决这个问题,我必须在清单文件中使用以下内容:

android:screenOrientation="portrait"    
android:launchMode="singleTop"    
android:configChanges="keyboardHidden|orientation|screenSize"
于 2013-07-22T09:18:01.710 回答
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

于 2012-09-25T18:06:53.180 回答