Androidで画面の回転を防ぐ


315

AsyncTaskを開始しているため、回転を禁止したいアクティビティの1つがあり、画面の回転によって再開されます。

このアクティビティを「ユーザーが怒って電話を振っている場合でも画面を回転させないでください」と伝える方法はありますか?



11
画面の向きの変更 AsyncTasksを処理できます。画面の向きの変更を防止するのは、面倒な回避策です。そして、方向の変化を越えてAsyncTaskを存続させることは難しくありません:)
Romain Guy


56
「ソリューションが存在し、難しくはない」と主張するだけではなく、実際にソリューションまたはコードRomainを提供する方がはるかに役立ちます。
Peter vdL 2013年

2
使用できます setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_LOCKED);
mcy 2016年

回答:


467

追加

android:screenOrientation="portrait" 

または

 android:screenOrientation="landscape" 

<activity>要素/マニフェストにSとすれば完了です。


95
これは単にアプリのバグを隠しているだけであり、ユーザーがつまずくことはほとんどないことに注意してください。しかし、彼らはまだそうします。設定を変更すると、アクティビティが再起動する可能性があります。再起動時の非同期タスクを処理するには、実際にアクティビティを正しく記述する必要があります。
ハックボット2010

1
これは、私にとってはうまくいかなかったケースがあります。アプリを開く前に、画面を横向きに設定しました。アプリを開くと、画面が縦向きに回転し、asynctaskが2回呼び出されました。
user522559

2
「ポートレートモードで開く」および「常にポートレートモードを維持する」に設定する必要があります。1つだけを行っても意味がありません。
キャロル

1
@hackbodに関係なく、これは「Androidアプリが画面の回転を妨げる」というgoogleヒットのナンバー1です。私の必要性は非同期タスクとは何の関係もありません
chiliNUT

7
@hackbodこの問題に対処するためのアクティビティを正しく記述するにはどうすればよいですか?
user41805

127

あなたは、自動回転画面を防ぐために、以下のロジックに従うことができながら、あなたがAsyncTask実行されています。

  1. を使用して、現在の画面の向きをアクティビティ内に保存しgetRequestedOrientation()ます。
  2. を使用して自動画面方向を無効にする setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_NOSENSOR)ます。
  3. を実行/実行しますAsyncTask
  4. あなたの終わりにAsyncTask使用して、前のオリエンテーションの状態を復元setRequestedOrientation(oldOrientation)

Activity内のプロパティに(UIスレッドで実行される)アクセスする方法はいくつかあることに注意してくださいAsyncTask。をAsyncTask内部クラスとして実装することもHandlerActiviyクラスを突くメッセージを使用することもできます。


9
選択した答えよりもはるかに優れています。
Matej 2012

3
素晴らしいアイデア:)現在の画面の向きを保存していない場合は、ActivityInfo.SCREEN_ORIENTATION_UNSPECIFIED
fligant

@emre、ありがとうございます。そうです、「あまりにも良いが真実であることを!」問題についての議論の膨大な量に注意してください:stackoverflow.com/q/3821423/294884 ...アンドロイドの専門家を、任意の欠点はここにあり!改めて感謝します。
Fattie、

3
くだらない!!これは、デバイスが横向きモードで始まる場合は機能しません。なんてこったい!Sux:O
Fattie

@Emre、このコードは特定のケースでは機能しません。たとえば、ユーザーがAsyncTaskの開始と終了の間で向きを変更した場合。すると、間違った向きを保存して復元してしまいます。
Pacerier 2014年

27

マニフェストファイルで、画面の回転をロックするアクティビティごとに追加します。水平モードでロックする場合は、次のようにします。

<activity
        ...
        ...
        android:screenOrientation="landscape">

または、垂直モードでロックしたい場合:

<activity
            ...
            ...
            android:screenOrientation="portrait">

24

これを行うことがわかった最も簡単な方法は、

this.setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_PORTRAIT);

onCreate内、直後

setContentView(R.layout.activity_main);

そう...

@Override
protected void onCreate(Bundle savedInstanceState) {
  super.onCreate(savedInstanceState);
  setContentView(R.layout.activity_main);
  this.setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_PORTRAIT);
}

7

AndroidManifestに入るのではなく、次のようにすることができます。

screenOrientation = getResources().getConfiguration().orientation;
getActivity().setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_LOCKED);
... AsyncTask

screenOrientation = getResources().getConfiguration().orientation;


@Override
protected void onPostExecute(String things) {
    context.setRequestedOrientation(PlayListFragment.screenOrientation);
    or 
    context.setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_FULL_SENSOR);
}

ここでの唯一の欠点は、APIレベル18以上が必要なことです。これが基本的に槍の先です。


この部分はホームボタンと最近のアプリボタンを無効にし、SCREEN_ORIENTATION_FULL_SENSORでロックを解除した後でも、無効な状態です。Android Nで
kAmol

6

Activity.java

@Override     
 public void onConfigurationChanged(Configuration newConfig) {       
        try {     
            super.onConfigurationChanged(newConfig);      
            if (this.getResources().getConfiguration().orientation == Configuration.ORIENTATION_LANDSCAPE) {      
                // land      
            } else if (this.getResources().getConfiguration().orientation == Configuration.ORIENTATION_PORTRAIT) {      
               // port       
            }    
        } catch (Exception ex) {       
     }   

AndroidManifest.xml

 <application android:icon="@drawable/icon" android:label="@string/app_name">
  <activity android:name="QRCodeActivity" android:label="@string/app_name"
  android:screenOrientation="landscape" >
   <intent-filter>
    <action android:name="android.intent.action.MAIN" />
    <category android:name="android.intent.category.LAUNCHER" />
   </intent-filter>
  </activity>

 </application>

2

AndroidManifest.xmlのACTIVITYの次の属性で十分です。

android:configChanges="orientation"

したがって、完全なアクティビティノードは次のようになります。

<activity android:name="Activity1"
          android:icon="@drawable/icon"
          android:label="App Name"
          android:excludeFromRecents="true"
          android:configChanges="orientation">
    <intent-filter>
        <action android:name="android.intent.action.MAIN"/>
        <category android:name="android.intent.category.LAUNCHER"/>
    </intent-filter>
</activity>

1

追加:

protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_NOSENSOR);
        ...
        ...
        ...
}

1

以下をAndroidManifest.xmlに追加します

[アプリ> src>メイン> AndroidManifest.xml]

<activity android:name=".MainActivity"
          android:configChanges="orientation"
          android:screenOrientation="portrait"/>

例:

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="xxx.zzzzzz.yyyyy">

   <uses-permission android:name="A-PERMISSION" />

   <application>
      <activity android:name=".MainActivity"
                android:screenOrientation="portrait"
                android:configChanges="orientation">
      </activity>
   </application>

</manifest>

0

Android Developer Tools(ADT)とEclipse を使用している場合は、AndroidManifest.xml-> Applicationタブ->に移動して、アクティビティを選択できます。最後に、好みの向きを選択します。多くのオプションから1つを選択できます。


0

manifest.xmlファイルに次のコードを追加する必要があります。回転してはいけないアクティビティ、そのアクティビティでこの要素を追加

android:screenOrientation="portrait"

その後、回転しません。


0

あなたはこの方法を試すことができます

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="com.itclanbd.spaceusers">

<uses-permission android:name="android.permission.INTERNET" />
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE"/>
<application
    android:allowBackup="true"
    android:icon="@mipmap/ic_launcher"
    android:label="@string/app_name"
    android:roundIcon="@mipmap/ic_launcher_round"
    android:supportsRtl="true"
    android:theme="@style/AppTheme">
    <activity android:name=".Login_Activity"
        android:screenOrientation="portrait">
        <intent-filter>
            <action android:name="android.intent.action.MAIN" />

            <category android:name="android.intent.category.LAUNCHER" />
        </intent-filter>
    </activity>
</application>


0

AsyncTaskLoaderを使用すると、画面の回転を防ぐよりもアプリを構築するのに優れた方法であるAsyncTaskを使用する代わりに、アクティビティが変更された場合でもデータを安全に保つことができます。


0

画面の回転を防ぐには、次の行をマニフェストに追加します。

<activity
        android:name=".YourActivity"
        android:screenOrientation="portrait" />

これは私にとってはうまくいきます。


0

"portrait"AndroidManifest.xmlファイルのユーザーは、良い解決策のように思えるかもしれません。ただし、特定のデバイス(横向きで最適に動作するデバイス)が縦向きになり、適切な向きになりません。最新のAndroidバージョンでは、エラーが発生します。だから私の提案はそれを使用する方が良い"nosensor"です。

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