6

Androidスマートフォンを上下逆にすると、アクティビティが回転してレイアウトが上下逆に表示されず、代わりに横向きモードのままになります。非常にシンプルなHelloWorldアプリでこれを試しました。android:configChanges="orientation"マニフェストに追加しonConfigurationChange()、アクティビティでオーバーライドして、そこにブレークポイントを設定しました。デバイスを上下逆に回転させると、縦向き(逆さま)から横向きに変更する1つの構成変更が生成されますが、横向きから縦向き(逆さま)に2回目の変更は行われません。これはAndroidの問題ですか、それとも私がしなければならないことがありますか?

マニフェスト:

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="hello.world"
    android:versionCode="1"
    android:versionName="1.0" >
   <uses-sdk android:minSdkVersion="10" />
    <application
        android:icon="@drawable/ic_launcher"
        android:label="@string/app_name" >
        <activity
            android:configChanges="orientation"
            android:name=".HelloWorldActivity"
            android:label="@string/app_name" >
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />
                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
        </activity>
    </application>
</manifest>

アクティビティ:

public class HelloWorldActivity
  extends Activity
{
  /** Called when the activity is first created. */
  @Override
  public void onCreate(Bundle savedInstanceState)
  {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.main);
  }

  public void onConfigurationChanged(Configuration newConfig)
  {
    super.onConfigurationChanged(newConfig);
    if (newConfig.orientation == Configuration.ORIENTATION_LANDSCAPE)
    {
      Log.e("MDO", "orientation change: landscape");
    }
    else if (newConfig.orientation == Configuration.ORIENTATION_PORTRAIT)
    {
      Log.e("MDO", "orientation change: portrait");
    }
  }
}
4

3 に答える 3

10

それは問題ではありません、それはAndroidがどのように機能するかです。縦向きではなく横向きモードでのみ逆さまに表示されます(正しく覚えていれば、バージョン2.2以降の横向きで表示されます)。構成の変更は、ポートレートからランドスケープに、またはその逆に移行するときに発生します。電話が上下逆さまになっているのか、それともどの方向に向いているのかを確認したい場合は、加速度センサーにアクセスする必要があります。これがその使用方法に関するチュートリアルであり、ここにSensorManagerドキュメントがあります。

編集:質問の作成者が自分で見つけたように、Android 2.3(APIレベル9)より古いものをサポートしたくない場合はandroid:screenOrientation="fullSensor"、マニフェストに追加するだけで十分です。

于 2012-07-20T19:12:00.177 に答える
3

mafifestのconfigChangesにscreenSizeを含めます。

android:configChanges="orientation|screenSize"

http://developer.android.com/guide/topics/resources/runtime-changes.htmlから:

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

于 2012-07-20T19:11:50.037 に答える
3

設定android:screenOrientation="fullSensor"は私がやろうとしていることを達成します。

于 2012-07-20T20:45:56.227 に答える