簡體   English   中英

在方向更改時調用活動,而無需重新啟動當前活動

[英]Invoke activity on orientation change without restarting current activity

我有一個包含許多活動的應用程序,其布局適用於手機大小(SFF)和平板電腦大小(LFF)的設備。 對於LFF設備,框架在方向更改時自動重新創建活動(橫向<->縱向)可以很好地完成我想要的事情。 在SFF設備上進行操作時,可以使用Activity.setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_PORTRAIT)將方向鎖定為縱向。

在SFF設備上運行時,我想在將設備物理旋轉為橫向時啟動其他活動。 (讓我們暫時不討論輪流啟動其他活動是否是一個好的設計原則。)

最初,我使用OrientationEventListener監視旋轉,但是在SFF設備的“自然”方向為橫向的情況下,此操作失敗。 當處於橫向時, OrientationEventListener.onOrientationChanged()將報告0度(+/- 45), WindowManager.getDefaultDisplay().getRotation()將報告Surface.ROTATION_0 我無法找到一種方法來確定設備的“自然”方向,以補償所報告的旋轉值。 有幾個SO問題對此進行了討論,但似乎沒有一個令人滿意的答案。

另一個選擇是在清單中使用android:configChanges="orientation|screenSize"並在onConfigurationChanged()捕獲方向更改。 問題在於它破壞了LFF設備的默認行為,我希望保留該行為。 駭人聽聞的事情確實存在:將清單中的每個活動復制為LFF和SFF版本,其中一個包含android:configChanges設置,另一個不包含android:configChanges設置,然后讓該活動在每次啟動新活動時都選擇適當的版本。

我當前的解決方案既不使用android:configChanges也不使用setRequestedOrientation()OrientationEventListener 相反,我在values-land定義了一個布爾資源is_landscape ,並在相關的Activity的onCreate()對此進行了測試。 這樣做的缺點是,旋轉到景觀時:

  • 即將啟動景觀活動的僅肖像活動,首先由框架重新創建,這相當昂貴,並且可能會延遲景觀活動的啟動;
  • 僅肖像活動將丟失某些狀態,否則狀態通常會被框架保留並在從景觀活動返回時可用。

任何人都可以提出更好的解決方案,包括發現設備“自然”定向的方法嗎? 我需要這個才能回到Android 4.0。

您必須結合使用getRotationgetResources().getConfiguration()來檢查自然方向。

public int getDefaultOrientation() {
    WindowManager windowManager =  (WindowManager) getSystemService(Context.WINDOW_SERVICE);
    Configuration config = getResources().getConfiguration();
    int rotation = windowManager.getDefaultDisplay().getRotation();

    if ( ((rotation == Surface.ROTATION_0 || rotation == Surface.ROTATION_180) &&
            config.orientation == Configuration.ORIENTATION_LANDSCAPE)
        || ((rotation == Surface.ROTATION_90 || rotation == Surface.ROTATION_270) &&    
            config.orientation == Configuration.ORIENTATION_PORTRAIT)) {
      return Configuration.ORIENTATION_LANDSCAPE;
    } else { 
      return Configuration.ORIENTATION_PORTRAIT;
    }
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM