2012-06-07 26 views
5

基本上,我按下按鈕,這會通過使用相機意圖打開您的默認相機應用程序。拍攝照片後,它將保存所需的內容並重定向到其他活動。圖片拍攝後的Android活動重置(方向?)

在這個活動中,我有一個可以成功上傳圖片的AsyncTask。那麼你可能會問什麼是我的問題。我的問題是,它重新創建我的活動,因此重置我的ProgressDialog與它一起。 (它運行活動,aSyncTask在它完成之前就會死亡,並重新創建我的活動以再次執行asynctask。)

它並不總是這樣做。我認爲這樣做是因爲它將手機的方向從橫向更改爲縱向。 (我有一個三星當我去它改變景觀,當我完成它,它可以追溯到肖像相機。)

我已經做了功課,並添加這些東西到我的清單:

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

我已經確定在縱向「鎖定」我的應用程序,但我仍然看到我的應用程序更改方向,我相信這就是爲什麼我的活動重新創建。

我打算添加各種檢查,但我認爲這不是處理這種情況的正確方法,因爲它有時不會重新創建活動。

我所說的檢查就是用:

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

反正有人可以幫我嗎?我只是想要它加載活動而不會自我毀滅我。

PS:虛擬機沒有任何問題。虛擬機加載活動並完成它而不重新創建活動。

PPS:做了額外的測試,在我的三星上,如果我將其保持在橫向模式下,它將起作用。所以它肯定是相機正在摧毀我的活動,因爲它的方向發生了變化。

+0

同樣的問題發生在我身上以及..讓你找到了解決辦法。如果這樣,請張貼它..這將是非常有益的 – GoCrazy

+0

你有一個佈局設計的景觀?佈局土地? – Ramz

+0

你好你發現任何解決方案:( –

回答

0

嘗試創建一個片段活動來處理顯示和更新進度對話框

在片段活動確保並設置「setRetainInstance(真);」這將確保它在主活動被創建/銷燬時不被銷燬。

將整個圖像捕獲過程放入此片段內部,包括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

+0

@Yihka這是否回答你的問題? – Aaron

8

我有同樣的問題,事實證明,您還需要監聽API級別13或更高的屏幕大小更改,如此處所述; https://stackoverflow.com/a/11483806

android:configChanges="orientation|screenSize" 
1

對於這個解決,我不得不使用下面的在我的清單文件:

android:screenOrientation="portrait"  
android:launchMode="singleTop"  
android:configChanges="keyboardHidden|orientation|screenSize" 
相關問題