299

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

しかし、ハードウェアQWERTYキーボード(仮想キーボードではない)を開くと、 HTCG1電話に問題があります。私のアクティビティはポートレートモードのままですが、再開されてすべての状態が失われるようです。これは、 HTCHeroバージョンでは発生しません。

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

4

13 に答える 13

325

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

于 2009-10-02T23:19:33.007 に答える
98

Intrications (以前のAshton)で述べたように、AndroidManifest.xmlを変更し、アクティビティがonConfigurationChangedイベントを希望どおりに処理することを確認する必要があります。これはそれがどのように見えるべきかです:

@Override
public void onConfigurationChanged(Configuration newConfig) {
    super.onConfigurationChanged(newConfig);
    setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_PORTRAIT);
}
于 2011-03-04T23:03:12.880 に答える
41

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

android:screenOrientation="nosensor" android:configChanges="keyboardHidden|orientation"
于 2011-07-09T19:42:34.120 に答える
23

前述のように、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"また、(マニフェストで)アクティビティを設定できます。ただし、この方法を使用すると、向きの変更をまったく処理できなくなります。

于 2012-01-15T14:01:35.810 に答える
21

これを使って..

    android:screenOrientation="portrait"
于 2013-04-03T15:00:51.083 に答える
14

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

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

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

于 2012-09-07T08:55:25.267 に答える
10

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

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

またはandroid:screenOrientation="landscape"

于 2013-07-30T17:40:57.187 に答える
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);
}
于 2011-11-23T22:29:13.380 に答える
7

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

これがコード(ロックとロック解除の方法)です。いくつかのデバイス(スマートフォンとタブレット)でテストされており、うまく機能します。

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);
}
于 2013-05-16T10:31:40.187 に答える
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
{...}
于 2016-11-14T13:36:44.543 に答える
1

追加

android:configChanges="keyboardHidden|orientation|screenSize" 

あなたのマニフェストに。

于 2013-07-25T06:38:49.283 に答える
0

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

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

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

于 2015-09-07T19:47:57.247 に答える
0

アプリ内のすべてのアクティビティにPORTRAITモードのみが必要な場合は、アプリケーションクラスで以下のように使用できます。

class YourApplicationName : Application() {

override fun onCreate() {
    super.onCreate()

    registerActivityLifecycleCallbacks(object : ActivityLifecycleCallbacks {

        override fun onActivityCreated(activity: Activity, savedInstanceState: Bundle?) {
            activity.requestedOrientation = ActivityInfo.SCREEN_ORIENTATION_PORTRAIT
        }

        override fun onActivityStarted(activity: Activity) {

        }

        override fun onActivityResumed(activity: Activity) {

        }

        override fun onActivityPaused(activity: Activity) {

        }

        override fun onActivityStopped(activity: Activity) {

        }

        override fun onActivitySaveInstanceState(activity: Activity, outState: Bundle) {

        }

        override fun onActivityDestroyed(activity: Activity) {

        }

    })

}

}

于 2021-01-07T13:10:28.107 に答える