【问题标题】:Android activity-reset after picture taken (orientation?)拍摄照片后Android活动重置(方向?)
【发布时间】:2012-06-11 12:14:49
【问题描述】:

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

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

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

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

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

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

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

我所说的检查是使用:

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

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

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

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

【问题讨论】:

  • 我也遇到了同样的问题..你找到解决方案了吗..如果是的话,请发布..这真的很有帮助
  • 你有专为景观设计的布局吗?layout-land?
  • 您好,您找到任何解决方案了吗:(

标签: android android-activity camera orientation reset


【解决方案1】:

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

android:configChanges="orientation|screenSize"

【讨论】:

    【解决方案2】:

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

    android:screenOrientation="portrait"    
    android:launchMode="singleTop"    
    android:configChanges="keyboardHidden|orientation|screenSize"
    

    【讨论】:

      【解决方案3】:

      尝试创建一个片段活动来处理显示和更新进度对话框

      在片段活动中确保并设置“setRetainInstance(true);”这将确保在创建/销毁主要活动时它不会被销毁。

      将整个图像捕获过程放在这个片段中可能是个好主意,包括异步任务。确保您没有从 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

      【讨论】:

      • @Yihka 这能回答你的问题吗?
      猜你喜欢
      • 1970-01-01
      • 2011-03-30
      • 1970-01-01
      • 2022-01-14
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多