Androidで向きの変更を無効にするにはどうすればよいですか?


287

縦向きモードで使用したいアプリケーションがあるので、マニフェストXMLでandroid:screenOrientation = "portrait"を定義しました。これはHTC Magic Phoneで問題なく機能します(他の電話での向きの変更も防止します)。

しかし、ハードウェアQWERTYキーボード(仮想キーボードではない)を開くと、HTC G1電話に問題が発生します。私の活動はポートレートモードのままですが、再開されたようで、すべての状態が失われます。これは、HTC Heroバージョンでは発生しません。

私のアプリケーションは非常に大きいので、キーボードを開いたときに、アプリケーションが再起動してすべての状態が失われるのは望ましくありません。どうすればそれを防ぐことができますか?


2
また、ここで探してみてください。 stackoverflow.com/questions/2366706/...
アンディ・ワインスタイン

回答:


317

2013年4月の更新:これを行わないでください。2009年に最初に質問に答えたときはそれは良い考えではありませんでしたが、今は本当に良い考えではありません。理由のためにhackbodによってこの答えを見てください:

Androidでの向きの変更時にasynctaskでアクティビティをリロードしない

android:configChanges="keyboardHidden|orientation"AndroidManifest.xmlに追加します。これは、自分で処理する構成変更をシステムに通知します。この場合は何もしません。

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

詳細については、開発者リファレンスconfigChanges を参照してください。

ただし、アプリケーションはいつでも(電話などで)中断される可能性があるため、一時停止したアプリケーションの状態を保存するコードを追加する必要があります。

更新: Android 3.2以降では、「screenSize」も追加する必要があります。

<activity
    android:name="MainActivity"
    android:screenOrientation="portrait"
    android:configChanges="keyboardHidden|orientation|screenSize">

開発者ガイドから自分で構成変更を処理する

注意:Android 3.2(APIレベル13)以降、デバイスが縦向きと横向きに切り替わると、「画面サイズ」も変更されます。したがって、(minSdkVersionおよびtargetSdkVersion属性で宣言されている)APIレベル13以上の開発時に方向の変更によるランタイムの再起動を防止する場合は、「orientation」値に加えて「screenSize」値を含める必要があります。つまり、を宣言する必要があります android:configChanges="orientation|screenSize"。ただし、アプリケーションがAPIレベル12以下をターゲットにしている場合、アクティビティは常にこの構成変更を自身で処理します(この構成変更は、Android 3.2以降のデバイスで実行されている場合でも、アクティビティを再開しません)。


36
これに追加して本当に明示的にするために、Androidは方向の変更に関係なく、いつでもアプリケーションを無慈悲に強制終了できるため、onPause()およびonSaveInstanceState()を使用して、状態に関係なく保存する必要があります。
エリックミル、

3.2の更新は非常に便利で、私をブロックしていたものでした。なぜ私のonConfigurationChangedハンドラーが起動しなかったのかはわかりませんでした。ありがとう!
sweetlilmre

3番目のパラメーター-2.3.xではscreenSizeが見つかりません。screenLayoutに変更する必要がありますか?
デッドフィッシュ2012

2
@Lummaいいえ、「screenSize」はAndroid 3.2以降でのみ必要です。どのレベルのAPIをターゲットにしていますか?レベル13以上をターゲットにしている場合にのみ追加する必要があると思います。明確にするために回答を更新します。
複雑化

1
他の人に役立つ場合に備えて、変更を上書きする<... android:configChanges = "orientation" ...>と<... android:screenOrientation = "portrait" ...>の両方を見つけましたデフォルトを定義します。
Sogger 2013

97

Intrications(以前のAshton)について述べたようにAndroidManifest.xmlを変更し、アクティビティが処理したいonConfigurationChangedイベントを処理することを確認する必要があります。これは次のようになります。

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

ドミトリーザイツェフで述べたように、置いた方がよいsetRequestedOrientation()ではonCreate()
Timmmm

3
oncreateでcontentViewsを設定する前に方向を設定する方が良いアプローチである場合は、onConfigurationChanged()前に呼び出されません。所属する構成の設定もよりクリーンなので、この回答は依然として有効です。onCreate()
サミュエル

39

私はあなたが両方を必要とすることをいつも見つけました

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

22

前述のように、android:configChanges(マニフェストファイル内の)アクティビティのセットはkeyboardHidden|orientation次のとおりです。

1)オーバーライド onConfigurationChanged()

@Override
public void onConfigurationChanged(Configuration newConfig) {
    super.onConfigurationChanged(newConfig);
    //here you can handle orientation change
}

2)この行をアクティビティの onCreate()

setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE);

同じ行をonConfigurationChangedに追加するよりも優れています。これは、アプリが縦向きモードになり、横向きに戻るためです(1回だけ発生しますが、煩わしいです)。

またandroid:screenOrientation="nosensor"、(マニフェストで)あなたの活動を設定することができます。ただし、この方法を使用すると、向きの変更をまったく処理できなくなります。


回転時にアクティビティが再作成されないようにしたいが、ユーザーがOSの設定で向きをロックできるようにしたい場合はどうすればよいですか?
Android開発者

@androiddeveloperその別の質問にはすでに回答があります:stackoverflow.com/a/14771495/926907
Dmitry Zaytsev

あなたのリンクは、設定が変更されたときに自分でコンテンツを変更することに関するものですが、ユーザーがOSを介して向きをロックすることを選択した場合に備えて、アクティビティのローテーションを回避したいのです設定(一部のデバイスでは、通知ドロワーのクイック設定を介して使用できます)。
Android開発者

@androiddeveloperああ、理解できたと思います。次に、このリンクを見てください:developer.android.com/reference/android/…ドキュメントによると、デフォルトの向きでは、ユーザーの好みがすでに考慮されているはずです。そうでない場合は、OS固有の動作であると思います。私はあなたの結果について聞いてうれしいです-今私はそれにも興味があります:)
Dmitry Zaytsev

デフォルトでユーザーの設定が処理されることはわかっていますが、画面を回転するとアクティビティが再作成されますが、これは望ましくありません。
Android開発者


13

アクティビティのOnCreateメソッドで、次のコードを使用します。

    @Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    this.setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_PORTRAIT);

これで、向きが縦向きになり、変更されることはありません。


4
これにより、方向設定が変更されるたびにアクティビティが再開されるのを防ぐことができます。
AxeEffect 2013年

また、前のアクティビティのアクティビティを横向きで入力した場合も機能しません。
w3bshark 2018

10

AndroidManifest.xmlファイルで、ロックするアクティビティごとに最後のscreenOrientation行を追加します。

android:label="@string/app_name"
android:name=".Login"
android:screenOrientation="portrait" >

またはandroid:screenOrientation = "landscape"


8

あなたの中のAndroidManifest.xmlファイル:

   <activity android:name="MainActivity" android:configChanges="keyboardHidden|orientation">

または

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

6

コードで画面をロックするには、画面の実際の回転(0、90、180、270)を使用する必要があり、画面の自然な位置を知る必要があります。スマートフォンでは、自然な位置は縦向きとタブレットになります。風景になります。

これがコード(lockおよびunlockメソッド)で、一部のデバイス(スマートフォンおよびタブレット)でテストされており、うまく機能します。

public static void lockScreenOrientation(Activity activity)
{   
    WindowManager windowManager =  (WindowManager) activity.getSystemService(Context.WINDOW_SERVICE);   
    Configuration configuration = activity.getResources().getConfiguration();   
    int rotation = windowManager.getDefaultDisplay().getRotation(); 

    // Search for the natural position of the device    
    if(configuration.orientation == Configuration.ORIENTATION_LANDSCAPE &&  
       (rotation == Surface.ROTATION_0 || rotation == Surface.ROTATION_180) ||  
       configuration.orientation == Configuration.ORIENTATION_PORTRAIT &&   
       (rotation == Surface.ROTATION_90 || rotation == Surface.ROTATION_270))   
    {   
        // Natural position is Landscape    
        switch (rotation)   
        {   
            case Surface.ROTATION_0:    
                activity.setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE);    
                break;      
            case Surface.ROTATION_90:   
                activity.setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_REVERSE_PORTRAIT); 
            break;      
            case Surface.ROTATION_180: 
                activity.setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_REVERSE_LANDSCAPE); 
                break;          
            case Surface.ROTATION_270: 
                activity.setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_PORTRAIT); 
                break;
        }
    }
    else
    {
        // Natural position is Portrait
        switch (rotation) 
        {
            case Surface.ROTATION_0: 
                activity.setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_PORTRAIT); 
            break;   
            case Surface.ROTATION_90: 
                activity.setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE); 
            break;   
            case Surface.ROTATION_180: 
                activity.setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_REVERSE_PORTRAIT); 
                break;          
            case Surface.ROTATION_270: 
                activity.setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_REVERSE_LANDSCAPE); 
                break;
        }
    }
}

public static void unlockScreenOrientation(Activity activity)
{
    activity.setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_UNSPECIFIED);
}

どのパラメーターをアクティビティとして渡す必要がありますか?
WISHY 2014年

メソッドを呼び出して向きをロック/ロック解除するア​​クティビティ。これは、別のアクティビティから呼び出される静的なパブリックユーティリティメソッドです。
PoOk 2014年

1
Androidは問題なく機能しますが、真剣に言えば、ロック画面の向きだけのためになぜすべてのs ***を行わなければならないのですか?
Cocorico 14

はい。これはマニフェストで行うように方向をロックします。これにより、onConfigurationChangedが呼び出されなくなります。UIを横置きにロックし、それでもonConfigurationChangedを呼び出すメソッドはありますか?Androidのカメラアプリと同じように
Ajith Memana 2014

SDK 18+にはSCREEN_ORIENTATION_LOCKEDフラグがあり、機能しているようですが、上記のコードを使用してすべてのデバイスをサポートする必要があります
DominicM

2

Visual Studio Xamarinの場合:

  1. 追加:

using Android.Content.PM; あなたの活動の名前空間リストに。

  1. 追加:

[Activity(ScreenOrientation = Android.Content.PM.ScreenOrientation.Portrait)]

あなたのクラスの属性として、そのように:

[Activity(ScreenOrientation = ScreenOrientation.Portrait)]
public class MainActivity : Activity
{...}

この質問はXamarin.Android、Androidのではない求めている
トレバー・ハート


0

現在、どの方法も機能していないようです。

ではAndroidのメーカー 1つの1つの簡単な方法は、追加することです android:screenOrientation="nosensor"

これにより、画面の向きが効果的にロックされます。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.