画面回転イベントを検出し、画面の向きを保持または変更することを決定するための疑似コードを次に示します。
public boolean onOrientationChanges(orientation) {
if(orientation == landscape)
if(settings.get("lock_orientation"))
return false; // Retain portrait mode
else
return true; // change to landscape mode
return true;
}
Androidで同様のものを作成するにはどうすればよいですか?
編集:実際に回答を探しています向きの変更を処理する場所。 screenOrientation = "portrait"を追加して方向を修正したくありません。
OnConfigurationChanges()と同様に、方向を処理できるものが必要ですが、手動でビューを再描画する必要はありません。
最初にDisplay
インスタンスが必要です:
_Display display = ((WindowManager) getSystemService(WINDOW_SERVICE)).getDefaultDisplay();
_
次に、オリエンテーションは次のように呼び出されます。
_int orientation = display.getOrientation();
_
あなたの方法として方向を確認し、これを使用して方向を変更してください:
_setRequestedOrientation (ActivityInfo.SCREEN_ORIENTATION_PORTRAIT);
_
お役に立てば幸いです。
更新:
では、oAllow
変数がBoolean
で、デフォルト値はFalse
であるとします。
_public void onConfigurationChanged(Configuration newConfig) {
super.onConfigurationChanged(newConfig);
Display display = ((WindowManager) getSystemService(WINDOW_SERVICE)).getDefaultDisplay();
int orientation = display.getOrientation();
switch(orientation) {
case Configuration.ORIENTATION_PORTRAIT:
if(!oAllow) {
setRequestedOrientation (ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE);
}
break;
case Configuration.ORIENTATION_LANDSCAPE:
if(!oAllow) {
setRequestedOrientation (ActivityInfo.SCREEN_ORIENTATION_PORTRAIT);
}
break;
}
}
_
さらに選択肢を追加できます。
私はこのサンプルを試していませんが、少なくとも解決方法についての手がかりをいくつか教えてくれます。エラーが発生した場合は教えてください。
[〜#〜]更新[〜#〜]
getOrientation()
はすでに非推奨です こちらを参照 。代わりにgetRotation()
を使用してください。デバイスが横向きモードになっているかどうかを確認するには、次のようにします。
_Display display = ((WindowManager) getSystemService(WINDOW_SERVICE))
.getDefaultDisplay();
int orientation = display.getRotation();
if (orientation == Surface.ROTATION_90
|| orientation == Surface.ROTATION_270) {
// TODO: add logic for landscape mode here
}
_
実行してみてください
getResources().getConfiguration().orientation
コンテキストオブジェクトから実行時の画面の向きを把握するために、可能な値が文書化されています here
方向変更イベントをキャッチするための答えは、Android開発ガイド: Handling the Configuration Change Yourself にあります。
ガイドから:
たとえば、次のマニフェストコードは、画面の向きの変更とキーボードの可用性の変更の両方を処理するアクティビティを宣言しています。
<activity Android:name = "。MyActivity"
Android:configChanges = "orientation | keyboardHidden"
Android:label = "@ string/app_name">
現在、これらの構成のいずれかが変更されても、MyActivityは再起動しません。代わりに、MyActivityはonConfigurationChanged()の呼び出しを受け取ります。このメソッドには、新しいデバイス構成を指定するConfigurationオブジェクトが渡されます。構成内のフィールドを読み取ることにより、インターフェースで使用されるリソースを更新することにより、新しい構成を決定し、適切な変更を行うことができます。このメソッドが呼び出されると、アクティビティのResourcesオブジェクトが更新され、新しい構成に基づいてリソースが返されるため、システムがアクティビティを再起動しなくても、UIの要素を簡単にリセットできます。
...
if (this.getWindow().getWindowManager().getDefaultDisplay()
.getOrientation() == ActivityInfo.SCREEN_ORIENTATION_PORTRAIT) {
// portrait mode
} else if (this.getWindow().getWindowManager().getDefaultDisplay()
.getOrientation() == ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE) {
// landscape
}
イベントをインターセプトしてオーバーライドする必要はありません。ただ使う:
// Allow rotation
setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_USER);
// Lock rotation (to Landscape)
setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_USER_LANDSCAPE);
ここで注意すべき点は、ジェリービーン以上の場合、ロックすると180度回転できることです。また、ロックを解除すると、ユーザーのマスター設定でローテーションが許可されている場合にのみ、ローテーションが許可されます。 180度の回転を禁止し、マスター設定をオーバーライドして回転を許可するなど、はるかに多くのことができるので、 ActivityInfo のオプションを確認してください
さらに、回転が行われないように事前設定している場合、アクティビティが破棄されてから再開されることはありません。向きを元に戻すことで、アクティビティが再開されます。したがって、事前に必要な設定をより効率的にすることができます。
ジェリービーン前の使用ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE
-これでは180度回転しません。
チェックAndroid実行時の画面の向き:
ListView listView = (ListView) findViewById(R.id.listView1);
if (getResources().getConfiguration().orientation == ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE) {
//do work for landscape screen mode.
listView.setPadding(0, 5, 0, 1);
} else if (getResources().getConfiguration().orientation == ActivityInfo.SCREEN_ORIENTATION_PORTRAIT) {
//Do work for portrait screen mode.
listView.setPadding(1, 10, 1, 10);
}
画面の向きを決定する別のソリューション:
public boolean isLandscape() {
return Resources.getSystem().getDisplayMetrics().widthPixels - Resources.getSystem().getDisplayMetrics().heightPixels > 0;
}