4

庫使用:程序兼容性-V7:22.2.1,設計:使用22.2.1活動返回過渡 - 共享元素 - 殺死活性

主題:

設備/的Android版本上再現:連結6

問題:返回活動快速重繪/出現,然後以期望的行爲淡入,只有"Don't keep activities alive"

我想知道這是一個錯誤還是預期的行爲。我有一個非常簡單的設置。活動A包含一個包裝在AppbarLayoutCoorindinatorLayout中的工具欄。工具欄包含一個Cardview和一個TextView。點擊TextView後,活動A將啓動活動B.我使用共享元素並將其作爲選項通過ActivityCompat.StartActivity(bundle, options);

我的共享元素即使在設備旋轉後也可以很好地工作。在閱讀我如何可以PostPoneEnterTransition和組合PreDrawListeners即使旋轉後我也能夠成功實現所需的轉換。我的實際活動包含一個Viewpager/TabLayout和2+片段,但爲了簡單起見,我已將它剝離回視頻中,並查看是否有其他內容導致此問題。

在處理輸入轉換回到活動A的輪換和延期時,我決定打開開發人員選項並檢查"Don't keep activities alive"video描述了在啓用該選項的情況下運行的應用程序。如果仔細觀察,您可以看到返回到活動A後,它會非常快速地完全繪製和隱藏,然後發生淡入淡出以及共享元素過渡。

我也排除了動畫中的導航欄和狀態欄,所以我沒有看到這些閃爍(重繪冗餘)。

我的問題是:

  1. 這是一個錯誤,還是我失去了爲了防止這種情況的一個步驟。

  2. 爲什麼應用程序/轉換與"Don't keep activities alive"相比,舊式設備輪轉(銷燬/重新創建)的行爲有所不同。

  3. 我注意到玩了一些谷歌應用程序,這種行爲不會發生,或至少我可以找到。有沒有辦法具體檢查我回來的活動是否「完全被摧毀」,這樣我就可以取消動畫了?或做一些不同的事情?

如果需要的話,但我的設置非常簡單,反映從Android文檔/堆棧溢出一堆煩人的例子我可以包括細節和代碼示例。

回答

0

對不起,我打算早些時候迴應。我最終做的是儘可能以代碼示例和教程在全新項目中重新創建示例。首先讓它使用單個圖像視圖,然後添加我的自定義佈局,這是一個浮動搜索欄。一切按預期工作。我回過頭來回顧一下我的實際項目源代碼(在嘗試調試這個問題時,這些源代碼被不同的嘗試和代碼註釋掉)並將其清理乾淨。我不能肯定地說,但我相信它來到了可能存在兩個問題:

「除非你做一些不尋常的......」 - 最有可能的我「是」的時候做一些不同尋常的我創造了這個問題做我的調試工作,缺乏對共享元素轉換框架和生命週期的全面理解。

我覺得發生了什麼事情是共享元素轉換失敗了做不正確的映射。我在XML中定義的轉換中排除了statusBarBackground。我的statusBarBackground被設置爲透明,因此對於擴展抽屜佈局我有很好的疊加效果。我發現在試圖通過代碼將statusbarbackground作爲共享元素添加時,視圖實際上是空的,導致崩潰(NPE)。以及我爲抽屜佈局設置了背景顏色(而不是透明)。我不能肯定地說,但這些錯誤的組合導致了奇怪的行爲。

最後,我要說的是,這個問題應該被關閉,一切都如預期運行。這將是很好的得到處理透明的狀態欄爲共享元素的更清楚了。

  1. 這是一個錯誤,還是我錯過了一個步驟,以防止這種情況?

    No. Everything is working as intended.

  2. 爲什麼應用程序/轉換不同的表現與「不保留活動活着」與普通的老式設備旋轉(破壞/重新創建)?

    It doesn't. When everything is setup proper and your timing and mapping of shared elements is correct, "Don't keep activities alive" is a concrete way to test your transitions against configuration changes.

  3. 我已經通過了一些谷歌應用程序玩耍注意到,此行爲不會發生,或者至少我能找到。有沒有辦法具體檢查我回來的活動是否「完全被摧毀」,這樣我就可以取消動畫了?或做一些不同的事情?

    This is because the Google dev's did it right :)

對於任何與共享的元素掙扎,這裏有一些建議。

  1. 從小開始。第一次使用的單一視圖,並確認你得到正確的行爲,在任何情況下,即使在旋轉和配置的變化,那麼你就可以增加複雜性。

  2. 使用SharedElementCallback調試你的過渡。你可以檢查哪些視圖被映射,哪個視圖失敗等。

+0

你能分享一些代碼,顯示你如何處理旋轉? –