1

Android の向きの処理に固有の不具合に遭遇したと思います。

私は活動Aを持っています

setContentView(R.layout.activity_main);
setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_NOSENSOR);

センサーがないということは、アクティビティ A が物理デバイスの回転の影響を受けないことを意味します。

オーバーライドされた onSaveInstanceBundle を持つアクティビティ B もあります

/*Will be called before orientation change*/
@Override
protected void onSaveInstanceState(Bundle currentState) {
      super.onSaveInstanceState(currentState);
      currentState.putBoolean(ApplicationConstants.Messages.ORIENTATION_CHANGED , true);
      currentState.putBoolean("RESTART", true);

      currentState.putString(ApplicationConstants.Messages.CURRENT_LANGUAGE,currentLocale);

    }

onSaveInstance は、画面の向きが変更されたときに常に呼び出されます。A と同様に、B も onCreate() の下に次のものがあります。

setContentView(R.layout.activity_main);
setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_NOSENSOR);

ここで難問が発生します。

通常のポートレート モードでデバイスを保持しているときに、B を呼び出すようにプログラムされている A からボタンを押します。onSaveInstance にブレークポイントがアタッチされています

予想どおり、B が呼び出されたときに onSaveInstance は呼び出されません

しかし、ここで奇妙な事実があります。デバイスをランドスケープ モードにしてから B を呼び出すと、B の onSaveInstance が呼び出され、ブレークポイントでプログラムが一時停止されるため、デバイスの画面がランドスケープになっていることがわかります。

したがって、アクティビティにセンサー引数がありませんが、センサーは実際にはまだ機能しています。そして、デバイスをランドスケープで保持している間にアクティビティ スイッチ IF DONE の間に、ターゲット アクティビティがランドスケープで開始されます。ブレークポイントを手放した後、B は縦向きビューに戻ります。

これが私が開発中のプロジェクトに影響を与えている理由については、長い話があります。誰かがこの状況について何か洞察を持っているかどうか知りたいと思いました。

要約すると、私の質問は次のとおりです。

アクティビティの切り替え中、Android システムは指定された向きを無視し、デフォルトでデバイスの物理的な位置を使用するというのは本当ですか? androidManifest で向きを設定できません。マニフェストに向きモードを入れた場合、これは当てはまらないことに注意しました。

4

2 に答える 2

4

アクティビティの切り替え中、Android システムは指定された方向を無視し、デフォルトでデバイスの物理的な位置を使用するというのは本当ですか? .

方向を指定していないため、正確にはそうではありません。SCREEN_ORIENTATION_NOSENSOR「今後はセンサーを無視して、現在の向きに保つ」という意味です。それは実行されるまで呼び出されませんonCreate()。「最初からポートレートに固定する」と言っているところはどこにもありません。

androidmanifest で向きを設定できません。マニフェストに向きモードを入れた場合、これは当てはまらないことに注意しました。

好奇心から、なぜできないのですか?これが最も一般的な方法です。

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

マニフェスト エントリで正しくロックされる理由は、Activity が実行される前に、ActivityManager がそれをロックする必要があることを認識しているためです。

于 2013-09-19T20:01:02.027 に答える
1

編集:参照用に以下を残しますが、これは明らかに実際には機能しません。:(


彼は、携帯電話ではアプリケーションを縦向きにロックし、タブレットでは自由に回転できるようにしたいと考えています。

うーん。実際には、マニフェストを使用してこれを実現できます。その方法は、何を「タブレット」として定義するかによって異なります。カットオフが Google の推奨値であると仮定しましょうsw600dp(7 インチ タブレットの場合、600 dp の最小幅が適切なブレークポイントです)。

resフォルダー内に次のファイル構造を作成できます。

res
    - values
        - styles.xml
    - values-sw600dp
        - styles.xml

(これがタブレット以外のスタイルになりますvalues/styles.xml) で、次のスタイルを定義しますActivity

<!-- This will be a base style that will affect both tablet and non-tablet -->
<style name="BaseTheme" parent="{{pick a base theme here -- e.g. Theme.Light}}"/>

<!-- This is the local style that will be used on devices whose smallest width
     is less than 600dp -->
<style name="BaseTheme.Activity">
    <item name="android:screenOrientation">portrait</item>
</style>

あなたのvalues-sw600dp/styles.xml

<!-- This is the local style that will be used on devices whose smallest
     width is greater than or equal to 600dp. We define nothing here other
     than the fact that the style exists, so it will have the default screen
     orientation - that is, it will rotate freely. -->
<style name="BaseTheme.Activity"/>

では、タグAndroidManifest.xml内に次を追加します。activity

android:theme="@style/BaseTheme.Activity"

そして、望ましい結果が得られるはずです。ただし、最初に追加したすべての Java コードを削除して、これを自分で管理するようにしてください。競合する可能性があり、予期しない結果が生じる可能性があります。

于 2013-09-19T20:16:16.260 に答える