2011-02-03 442 views
220

我試圖強制「肖像」模式爲我的應用程序,因爲我的應用程序絕對不是設計爲「風景」模式。強制「肖像」方向模式

閱讀一些論壇上後,我在清單文件中添加這些行:

<application 
    android:debuggable="true" 
    android:icon="@drawable/icon" 
    android:label="@string/app_name" 
    android:screenOrientation="portrait"> 

不過,這並不在我的設備(HTC Desire的)上工作。它從「portrait」lo「landscape」切換,忽略清單文件中的行。

更多的論壇看完後,我想在我的清單文件中添加此:

<application 
    android:debuggable="true" 
    android:icon="@drawable/icon" 
    android:label="@string/app_name" 
    android:configChanges="orientation"  
    android:screenOrientation="portrait"> 

而這個函數在我的活動類:

public void onConfigurationChanged(Configuration newConfig) 
{ 
    super.onConfigurationChanged(newConfig); 
    setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_PORTRAIT); 
} 

但同樣,沒有運氣。

回答

430

方向不適用於應用元素,相反,你應該應用屬性的活動元素,還必須設置configChanges如下所述。

實施例:

<activity 
    android:screenOrientation="portrait" 
    android:configChanges="orientation|keyboardHidden"> 
</activity> 

這在清單文件AndroidManifest.xml施加。

+1

謝謝!那是我的錯! – thomaus 2011-02-03 11:51:40

+12

什麼是configChanges? – Dror 2012-10-23 20:05:31

+45

@Orchestrator,configChanges表示配置更改由活動本身處理。沒有它,如果方向改變,活動將重新開始。你可能會問,如果你已經指定方向是「肖像」,它將如何改變?如果您啓動另一項改變方向的活動,那麼該活動可能會更改,然後該新活動即會退出,並將您返回到活動狀態。例如,三星Galaxy S3上的默認圖像捕獲目的是在某些方向上進行的。 – 2013-01-08 00:12:39

9

我認爲android:screenOrientation="portrait"可以用於個人活動。因此,使用該屬性在<activity>標籤,如:

<activity android:name=".<Activity Name>" 
    android:label="@string/app_name" 
    android:screenOrientation="portrait"> 
    ...   
</activity> 
1

我想你想添加android:configChanges="orientation|keyboardHidden"到你的活動?否則,該活動將在config-change上重新啓動。該onConfigurationChanged就不叫那麼,只有onCreate

15

注意

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

在清單文件中添加 - 在活動定義。

2

我在AndroidManifest.xml中

<activity 
    android:configChanges="orientation|keyboardHidden|keyboard|screenSize|locale" 
    android:label="@string/app_name" android:name="Project Name" 
    android:theme="@android:style/Theme.Black.NoTitleBar"> 

其中我改變了這條線(剛添加android:screenOrientation="portrait"

<activity 
    android:configChanges="orientation|keyboardHidden|keyboard|screenSize|locale" 
    android:label="@string/app_name" android:name="Project Name" 
    android:screenOrientation="portrait" 
    android:theme="@android:style/Theme.Black.NoTitleBar"> 

這種固定的東西對我來說。

2

東西補充:我已經更新的應用程序最近,以前是在風景和肖像模式下工作,我想更新的版本應該在縱向模式下工作,所以我加了

android:screenOrientation="portrait" 

到相應的活動,並且當我測試更新時它就崩潰了。然後我加

android:configChanges="orientation|keyboardHidden" 

太,它的工作原理。

1

根據Android的文檔,您通常還應該包含screenSize作爲可能的配置更改。

android:configChanges="orientation|screenSize" 

如果您的應用程序的目標API級別13或更高版本(由 的minSdkVersion和targetSdkVersion屬性的聲明),那麼你也應該 申報「屏幕尺寸」的配置,因爲它也改變 設備時在縱向和橫向之間切換。

另外,如果你所有的包括你的例子價值keyboardHidden,你不應該那麼也如果你有像我這樣的活動很多考慮localemccfontScalekeyboard和其他人?..

7

,在你的應用程序中或者如果你不想在清單中輸入每個活動標籤的代碼,你可以這樣做。

在你的應用基礎類

你會得到一個生命週期回調

所以基本上是在創建時應用類上創建習慣這裏引發的是代碼爲每項活動發生在..

public class MyApplication extends Application{ 

@Override 
    public void onCreate() { 
     super.onCreate(); 

    registerActivityLifecycleCallbacks(new ActivityLifecycleCallbacks() { 
      @Override 
      public void onActivityCreated(Activity activity, Bundle bundle) { 
       activity.setRequestedOrientation(
         ActivityInfo.SCREEN_ORIENTATION_PORTRAIT); 


// for each activity this function is called and so it is set to portrait mode 


      } 

      @Override 
      public void onActivityStarted(Activity activity) { 

      } 

      @Override 
      public void onActivityResumed(Activity activity) { 

      } 

      @Override 
      public void onActivityPaused(Activity activity) { 

      } 

      @Override 
      public void onActivityStopped(Activity activity) { 

      } 

      @Override 
      public void onActivitySaveInstanceState(Activity activity, Bundle bundle) { 

      } 

      @Override 
      public void onActivityDestroyed(Activity activity) { 

      } 
     }); 
} 

我希望這有幫助。

0

簡短回答:不要這樣做。

重新設計您的應用程序,以便它可以在縱向和橫向模式下運行。沒有像UI那樣的設計不能在縱向和橫向上工作的東西;只有懶惰或缺乏想象力的開發人員。

原因很簡單。您希望您的應用盡可能在儘可能多的不同設備上儘可能廣泛地被用戶使用。通過強制特定的屏幕方向,您可以防止您的應用在不支持該方向的設備上運行(可用),並令您偏好和疏遠喜歡不同方向的潛在客戶。

示例:您將應用程序設計爲強制縱向模式。客戶在主要以橫向模式使用的2合1設備上下載應用程序。
結果1:您的應用程序無法使用,或者您的客戶被迫取消鎖定設備,旋轉設備,並以不熟悉或不舒服的方向使用設備。
後果2:客戶因應用程序的非直觀設計而感到沮喪,並找到替代品或完全摒棄該應用程序。

我現在正在與一個應用程序戰鬥,作爲一個消費者和開發者,我討厭它。與應用程序一樣有用,它提供的功能非常棒,我絕對討厭這款應用程序,因爲它迫使我使用與我使用設備的其他方式相反的方向。

你不希望你的客戶討厭你的應用程序。


我知道這並不直接回答這個問題,所以我想解釋一下對於那些誰是好奇,更詳細一點。

這是開發人員是在編寫代碼非常好,在設計真的很可怕的趨勢。這個問題雖然聽起來像一個代碼問題,提問者當然覺得它是一個代碼問題,但這真的是一個設計問題。

真正的問題是「我應該如何設計我的UI?」提問者選擇將UI設計爲僅在肖像模式下才能正常工作。我懷疑這是爲了節省開發時間,或者因爲應用程序的工作流程特別有利於肖像佈局。但是這些原因忽略了激勵適當設計的所有真正重要因素。

  1. 客戶互動 - 您希望您的客戶感受到拉入您的應用,而不是被擠出。應用程序應該在打開應用程序之前順利地從您的客戶所做的任何事情轉換而來(這是大多數平臺具有一致設計原則的原因,所以大多數應用程序看起來或多或少都相似,但他們不必這樣做。)

  2. 客戶響應 - 您希望您的客戶對您的應用程序做出積極響應。他們應該喜歡使用它。即使它是工作的工資單應用程序,他們也應該很高興打開它並開始工作。該應用程序應該爲您的客戶節省時間並減少對其他選擇的沮喪。 (應用程序可能會惹惱用戶對您的應用程序產生怨恨,從而對您的品牌產生不滿)。

  3. 客戶轉換 - 您希望您的客戶能夠快速輕鬆地從瀏覽移動到互動。這是任何應用的最終目標,可將印象轉化爲收入。 (不產生收入的應用程序是你的時間來建立,從業務的角度浪費。)

設計不當的UI減少了客戶的參與和響應,最終導致較低的收入。在以移動爲中心的世界中(特別是在縱向/橫向顯示模式方面),這就解釋了響應式網頁設計爲何如此重要。 Walmart Canada introduced responsive design on their website in November 2013 and saw a 20% increase in customer conversion.奧尼爾服裝實施響應式網頁設計和revenue from customers using iOS devices increased 101.25%, and 591.42% from customers using Android devices

不要強迫你的應用程序到一個單一的顯示模式。使其響應並使其變得漂亮。

相關問題